Interpolation constructor
Creates a new Interpolation with the given contents.
The spans must include a FileSpan for each Expression in contents.
These spans should generally cover the entire #{} surrounding the
expression.
The single span must cover the entire interpolation.
Implementation
Interpolation(
Iterable<Object /* String | Expression */ > contents,
Iterable<FileSpan?> spans,
this.span,
) : contents = List.unmodifiable(contents),
spans = List.unmodifiable(spans) {
if (spans.length != contents.length) {
throw ArgumentError.value(
this.spans,
"spans",
"Must be the same length as contents.",
);
}
for (var i = 0; i < this.contents.length; i++) {
var isString = this.contents[i] is String;
if (!isString && this.contents[i] is! Expression) {
throw ArgumentError.value(
this.contents,
"contents",
"May only contain Strings or Expressions.",
);
} else if (isString) {
if (i != 0 && this.contents[i - 1] is String) {
throw ArgumentError.value(
this.contents,
"contents",
"May not contain adjacent Strings.",
);
} else if (i < spans.length && this.spans[i] != null) {
throw ArgumentError.value(
this.spans,
"spans",
"May not have a value for string elements (at index $i).",
);
}
} else if (i >= spans.length || this.spans[i] == null) {
throw ArgumentError.value(
this.spans,
"spans",
"Must not have a value for expression elements (at index $i).",
);
}
}
}