Fix all strong mode errors and warnings.
This is almost all:
- Adding type annotations to empty lists that are later filled. Many
of these could be simplified by using .map(...).toList() to create
the list instead, but I wanted to minimize my changes.
- Adding type arguments to some List annotations.
I did find one thing that I believe was a bug where a list was being
inadvertently flattened. Strong mode caught that.
R=terry@google.com
Review URL: https://codereview.chromium.org//1832993003 .
diff --git a/.analysis_options b/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+ strong-mode: true
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b4ee9e1..7133be0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.13.0
+
+ * **BREAKING** Fix all [strong mode][] errors and warnings.
+ This involved adding more precise on some public APIs, which
+ is why it may break users.
+
+[strong mode]: https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md
+
## 0.12.2
* Fix to handle calc functions however, the expressions are treated as a
diff --git a/example/call_parser.dart b/example/call_parser.dart
index 7179a17..3ae5889 100644
--- a/example/call_parser.dart
+++ b/example/call_parser.dart
@@ -2,6 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
import 'package:csslib/parser.dart' as css;
+import 'package:csslib/src/messages.dart';
import 'package:csslib/visitor.dart';
const _default = const css.PreprocessorOptions(
@@ -16,7 +17,7 @@
* tests (by default) will ensure that the CSS is really valid.
*/
StyleSheet parseCss(String cssInput,
- {List errors, css.PreprocessorOptions opts}) {
+ {List<Message> errors, css.PreprocessorOptions opts}) {
return css.parse(cssInput,
errors: errors, options: opts == null ? _default : opts);
}
@@ -27,7 +28,7 @@
(emitCss..visitTree(ss, pretty: true)).toString();
main() {
- var errors = [];
+ var errors = <Message>[];
// Parse a simple stylesheet.
print('1. Good CSS, parsed CSS emitted:');
diff --git a/lib/parser.dart b/lib/parser.dart
index b3a22d6..12c9d21 100644
--- a/lib/parser.dart
+++ b/lib/parser.dart
@@ -356,7 +356,7 @@
* : IDENT
*/
List<MediaQuery> processMediaQueryList() {
- var mediaQueries = [];
+ var mediaQueries = <MediaQuery>[];
bool firstTime = true;
var mediaQuery;
@@ -409,7 +409,7 @@
if (_peekIdentifier()) type = identifier();
}
- var exprs = [];
+ var exprs = <MediaExpression>[];
if (unaryOp == -1 || unaryOp == TokenKind.MEDIA_OP_AND) {
var andOp = false;
@@ -775,7 +775,7 @@
var name = identifier();
- List<VarDefinitionDirective> params = [];
+ var params = <VarDefinition>[];
// Any parameters?
if (_maybeEat(TokenKind.LPAREN)) {
var mustHaveParam = false;
@@ -813,7 +813,7 @@
if (declGroup.declarations.any((decl) {
return decl is Declaration && decl is! IncludeMixinAtDeclaration;
})) {
- var newDecls = [];
+ var newDecls = <Declaration>[];
productions.forEach((include) {
// If declGroup has items that are declarations then we assume
// this mixin is a declaration mixin not a top-level mixin.
@@ -943,7 +943,7 @@
name = identifier();
}
- var params = [];
+ var params = <List<Expression>>[];
// Any parameters? Parameters can be multiple terms per argument e.g.,
// 3px solid yellow, green is two parameters:
@@ -951,7 +951,7 @@
// 2. green
// the first has 3 terms and the second has 1 term.
if (_maybeEat(TokenKind.LPAREN)) {
- var terms = [];
+ var terms = <Expression>[];
var expr;
var keepGoing = true;
while (keepGoing && (expr = processTerm()) != null) {
@@ -1041,8 +1041,8 @@
if (checkBrace) _eat(TokenKind.LBRACE);
- List decls = [];
- List dartStyles = []; // List of latest styles exposed to Dart.
+ var decls = <TreeNode>[];
+ var dartStyles = []; // List of latest styles exposed to Dart.
do {
var selectorGroup = _nestedSelector();
@@ -1093,7 +1093,7 @@
}
List<DeclarationGroup> processMarginsDeclarations() {
- List groups = [];
+ var groups = <DeclarationGroup>[];
var start = _peekToken.span;
@@ -1487,7 +1487,7 @@
processSelectorExpression() {
var start = _peekToken.span;
- var expressions = [];
+ var expressions = <Expression>[];
Token termToken;
var value;
@@ -2269,7 +2269,8 @@
}
var param = expr.expressions[0];
- var varUsage = new VarUsage(param.text, [], _makeSpan(start));
+ var varUsage = new VarUsage(
+ (param as LiteralTerm).text, [], _makeSpan(start));
expr.expressions[0] = varUsage;
return expr.expressions;
}
@@ -2543,11 +2544,11 @@
_error("too many parameters to var()", _peekToken.span);
}
- var paramName = expr.expressions[0].text;
+ var paramName = (expr.expressions[0] as LiteralTerm).text;
// [0] - var name, [1] - OperatorComma, [2] - default value.
- var defaultValues =
- expr.expressions.length >= 3 ? expr.expressions.sublist(2) : [];
+ var defaultValues = expr.expressions.length >= 3
+ ? expr.expressions.sublist(2) : <Expression>[];
return new VarUsage(paramName, defaultValues, _makeSpan(start));
default:
var expr = processExpr();
diff --git a/lib/src/analyzer.dart b/lib/src/analyzer.dart
index fc27ceb..4d3e3c8 100644
--- a/lib/src/analyzer.dart
+++ b/lib/src/analyzer.dart
@@ -243,7 +243,7 @@
var selectors = node.selectorGroup.selectors;
// Create a merged set of previous parent selectors and current selectors.
- var newSelectors = [];
+ var newSelectors = <Selector>[];
for (Selector selector in selectors) {
for (Selector nestedSelector in nestedSelectors) {
var seq = _mergeNestedSelector(nestedSelector.simpleSelectorSequences,
@@ -267,7 +267,7 @@
// the parent selector is pre-pended to the current selector.
var hasThis = current.any((s) => s.simpleSelector.isThis);
- var newSequence = [];
+ var newSequence = <SimpleSelectorSequence>[];
if (!hasThis) {
// If no & in the sector group then prefix with the parent selector.
@@ -302,7 +302,7 @@
List<SimpleSelectorSequence> sequences) {
if (sequences.isEmpty) return sequences;
- var newSequences = [];
+ var newSequences = <SimpleSelectorSequence>[];
var first = sequences.first;
newSequences.add(new SimpleSelectorSequence(
first.simpleSelector, first.span, TokenKind.COMBINATOR_DESCENDANT));
@@ -592,7 +592,7 @@
* Given a mixin's defined arguments return a cloned mixin defintion that has
* replaced all defined arguments with user's supplied VarUsages.
*/
- MixinDefinition transform(List callArgs) {
+ MixinDefinition transform(List<List<Expression>> callArgs) {
// TODO(terry): Handle default arguments and varArgs.
// Transform mixin with callArgs.
for (var index = 0; index < _definedArgs.length; index++) {
@@ -628,11 +628,11 @@
}
/** Rip apart var def with multiple parameters. */
- List<List<TreeNode>> _varDefsAsCallArgs(var callArg) {
- var defArgs = [];
+ List<List<Expression>> _varDefsAsCallArgs(var callArg) {
+ var defArgs = <List<Expression>>[];
if (callArg is List && callArg[0] is VarUsage) {
var varDef = varDefs[callArg[0].name];
- var expressions = varDef.expression.expressions;
+ var expressions = (varDef.expression as Expressions).expressions;
assert(expressions.length > 1);
for (var expr in expressions) {
if (expr is! OperatorComma) {
@@ -756,11 +756,11 @@
// We're a list of @include(s) inside of a mixin ruleset - convert
// to a list of IncludeMixinAtDeclaration(s).
var origRulesets = mixinDef.rulesets;
- var rulesets = [];
+ var rulesets = <Declaration>[];
if (origRulesets.every((ruleset) => ruleset is IncludeDirective)) {
origRulesets.forEach((ruleset) {
- rulesets
- .add(new IncludeMixinAtDeclaration(ruleset, ruleset.span));
+ rulesets.add(new IncludeMixinAtDeclaration(
+ ruleset as IncludeDirective, ruleset.span));
});
_IncludeReplacer.replace(_styleSheet, node, rulesets);
}
@@ -841,7 +841,7 @@
/** @include as a top-level with ruleset(s). */
class _IncludeReplacer extends Visitor {
final _include;
- final List<Declaration> _newDeclarations;
+ final List<TreeNode> _newDeclarations;
bool _foundAndReplaced = false;
/**
@@ -849,7 +849,7 @@
* with the [newRules].
*/
static void replace(
- StyleSheet ss, var include, List<Declaration> newDeclarations) {
+ StyleSheet ss, var include, List<TreeNode> newDeclarations) {
var visitor = new _IncludeReplacer(include, newDeclarations);
visitor.visitStyleSheet(ss);
}
diff --git a/lib/src/polyfill.dart b/lib/src/polyfill.dart
index b18abd1..69f9e6d 100644
--- a/lib/src/polyfill.dart
+++ b/lib/src/polyfill.dart
@@ -170,7 +170,7 @@
}
List<Expression> resolveUsageTerminal(VarUsage usage) {
- var result = [];
+ var result = <Expression>[];
var varDef = _knownVarDefs[usage.name];
var expressions;
diff --git a/lib/src/property.dart b/lib/src/property.dart
index c2cf776..b4beaee 100644
--- a/lib/src/property.dart
+++ b/lib/src/property.dart
@@ -1232,4 +1232,4 @@
num get height => (top != null ? top : 0) + (bottom != null ? bottom : 0);
}
-_mergeVal(x, y) => y != null ? y : x;
+/*=T*/ _mergeVal/*<T>*/(/*=T*/ x, /*=T*/ y) => y != null ? y : x;
diff --git a/lib/src/tokenizer.dart b/lib/src/tokenizer.dart
index d423104..bc00fee 100644
--- a/lib/src/tokenizer.dart
+++ b/lib/src/tokenizer.dart
@@ -260,7 +260,7 @@
Token finishIdentifier() {
// If we encounter an escape sequence, remember it so we can post-process
// to unescape.
- var chars = [];
+ var chars = <int>[];
// backup so we can start with the first character
int validateFrom = _index;
diff --git a/lib/src/tree.dart b/lib/src/tree.dart
index ba8370e..ded846d 100644
--- a/lib/src/tree.dart
+++ b/lib/src/tree.dart
@@ -421,7 +421,7 @@
: super(span);
ImportDirective clone() {
- var cloneMediaQueries = [];
+ var cloneMediaQueries = <MediaQuery>[];
for (var mediaQuery in mediaQueries) {
cloneMediaQueries.add(mediaQuery.clone());
}
@@ -483,7 +483,7 @@
TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase();
MediaQuery clone() {
- var cloneExpressions = [];
+ var cloneExpressions = <MediaExpression>[];
for (var expr in expressions) {
cloneExpressions.add(expr.clone());
}
@@ -500,11 +500,11 @@
: super(span);
MediaDirective clone() {
- var cloneQueries = [];
+ var cloneQueries = <MediaQuery>[];
for (var mediaQuery in mediaQueries) {
cloneQueries.add(mediaQuery.clone());
}
- var cloneRulesets = [];
+ var cloneRulesets = <RuleSet>[];
for (var ruleset in rulesets) {
cloneRulesets.add(ruleset.clone());
}
@@ -520,7 +520,7 @@
HostDirective(this.rulesets, SourceSpan span) : super(span);
HostDirective clone() {
- var cloneRulesets = [];
+ var cloneRulesets = <RuleSet>[];
for (var ruleset in rulesets) {
cloneRulesets.add(ruleset.clone());
}
@@ -540,7 +540,7 @@
: super(span);
PageDirective clone() {
- var cloneDeclsMargin = [];
+ var cloneDeclsMargin = <DeclarationGroup>[];
for (var declMargin in _declsMargin) {
cloneDeclsMargin.add(declMargin.clone());
}
@@ -635,7 +635,7 @@
bool get isExtension => true;
StyletDirective clone() {
- var cloneRulesets = [];
+ var cloneRulesets = <RuleSet>[];
for (var ruleset in rulesets) {
cloneRulesets.add(ruleset.clone());
}
@@ -675,14 +675,14 @@
class MixinDefinition extends Directive {
final String name;
- final List definedArgs;
+ final List<TreeNode> definedArgs;
final bool varArgs;
MixinDefinition(this.name, this.definedArgs, this.varArgs, SourceSpan span)
: super(span);
MixinDefinition clone() {
- var cloneDefinedArgs = [];
+ var cloneDefinedArgs = <TreeNode>[];
for (var definedArg in definedArgs) {
cloneDefinedArgs.add(definedArg.clone());
}
@@ -694,18 +694,18 @@
/** Support a Sass @mixin. See http://sass-lang.com for description. */
class MixinRulesetDirective extends MixinDefinition {
- final List rulesets;
+ final List<TreeNode> rulesets;
- MixinRulesetDirective(String name, List<VarDefinitionDirective> args,
+ MixinRulesetDirective(String name, List<VarDefinition> args,
bool varArgs, this.rulesets, SourceSpan span)
: super(name, args, varArgs, span);
MixinRulesetDirective clone() {
- var clonedArgs = [];
+ var clonedArgs = <VarDefinition>[];
for (var arg in definedArgs) {
clonedArgs.add(arg.clone());
}
- var clonedRulesets = [];
+ var clonedRulesets = <TreeNode>[];
for (var ruleset in rulesets) {
clonedRulesets.add(ruleset.clone());
}
@@ -719,12 +719,12 @@
class MixinDeclarationDirective extends MixinDefinition {
final DeclarationGroup declarations;
- MixinDeclarationDirective(String name, List<VarDefinitionDirective> args,
+ MixinDeclarationDirective(String name, List<TreeNode> args,
bool varArgs, this.declarations, SourceSpan span)
: super(name, args, varArgs, span);
MixinDeclarationDirective clone() {
- var clonedArgs = [];
+ var clonedArgs = <TreeNode>[];
for (var arg in definedArgs) {
clonedArgs.add(arg.clone());
}
@@ -738,16 +738,14 @@
/** To support consuming a SASS mixin @include. */
class IncludeDirective extends Directive {
final String name;
- final List<List<TreeNode>> args;
+ final List<List<Expression>> args;
IncludeDirective(this.name, this.args, SourceSpan span) : super(span);
IncludeDirective clone() {
- var cloneArgs = [];
+ var cloneArgs = <List<Expression>>[];
for (var arg in args) {
- for (var term in arg) {
- cloneArgs.add(term.clone());
- }
+ cloneArgs.add(arg.map((term) => term.clone()).toList());
}
return new IncludeDirective(name, cloneArgs, span);
}
@@ -852,7 +850,7 @@
class DeclarationGroup extends TreeNode {
/** Can be either Declaration or RuleSet (if nested selector). */
- final List declarations;
+ final List<TreeNode> declarations;
DeclarationGroup(this.declarations, SourceSpan span) : super(span);
@@ -867,10 +865,10 @@
class MarginGroup extends DeclarationGroup {
final int margin_sym; // TokenType for for @margin sym.
- MarginGroup(this.margin_sym, List<Declaration> decls, SourceSpan span)
+ MarginGroup(this.margin_sym, List<TreeNode> decls, SourceSpan span)
: super(decls, span);
MarginGroup clone() =>
- new MarginGroup(margin_sym, super.clone() as dynamic, span);
+ new MarginGroup(margin_sym, super.clone().declarations, span);
visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
}
@@ -881,7 +879,7 @@
VarUsage(this.name, this.defaultValues, SourceSpan span) : super(span);
VarUsage clone() {
- var clonedValues = [];
+ var clonedValues = <Expression>[];
for (var expr in defaultValues) {
clonedValues.add(expr.clone());
}
diff --git a/pubspec.yaml b/pubspec.yaml
index 96f403e..8a9507e 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: csslib
-version: 0.12.2
+version: 0.13.0-dev
author: Polymer.dart Team <web-ui-dev@dartlang.org>
description: A library for parsing CSS.
homepage: https://github.com/dart-lang/csslib
diff --git a/test/big_1_test.dart b/test/big_1_test.dart
index f92ea82..9a6a584 100644
--- a/test/big_1_test.dart
+++ b/test/big_1_test.dart
@@ -4,11 +4,12 @@
library big_1_test;
+import 'package:csslib/src/messages.dart';
import 'package:test/test.dart';
import 'testing.dart';
compilePolyfillAndValidate(String input, String generated) {
- var errors = [];
+ var errors = <Message>[];
var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
expect(stylesheet != null, true);
expect(errors.isEmpty, true, reason: errors.toString());
diff --git a/test/compiler_test.dart b/test/compiler_test.dart
index df5a44a..5faabe2 100644
--- a/test/compiler_test.dart
+++ b/test/compiler_test.dart
@@ -7,11 +7,12 @@
import 'dart:convert';
import 'package:test/test.dart';
import 'package:csslib/parser.dart';
+import 'package:csslib/src/messages.dart';
import 'package:csslib/visitor.dart';
import 'testing.dart';
void testClass() {
- var errors = [];
+ var errors = <Message>[];
var input = ".foobar {}";
var stylesheet = parseCss(input, errors: errors);
@@ -24,7 +25,7 @@
expect(stylesheet.topLevels[0] is RuleSet, true);
- var ruleset = stylesheet.topLevels[0];
+ var ruleset = stylesheet.topLevels[0] as RuleSet;
expect(ruleset.selectorGroup.selectors.length, 1);
expect(ruleset.declarationGroup.declarations.length, 0);
@@ -37,7 +38,7 @@
}
void testClass2() {
- var errors = [];
+ var errors = <Message>[];
var input = ".foobar .bar .no-story {}";
var stylesheet = parseCss(input, errors: errors);
@@ -49,7 +50,7 @@
expect(stylesheet.topLevels.length, 1);
expect(stylesheet.topLevels[0] is RuleSet, true);
- var ruleset = stylesheet.topLevels[0];
+ var ruleset = stylesheet.topLevels[0] as RuleSet;
expect(ruleset.selectorGroup.selectors.length, 1);
expect(ruleset.declarationGroup.declarations.length, 0);
@@ -73,7 +74,7 @@
}
void testId() {
- var errors = [];
+ var errors = <Message>[];
var input = "#elemId {}";
var stylesheet = parseCss(input, errors: errors);
@@ -85,7 +86,7 @@
expect(stylesheet.topLevels.length, 1);
expect(stylesheet.topLevels[0] is RuleSet, true);
- var ruleset = stylesheet.topLevels[0];
+ var ruleset = stylesheet.topLevels[0] as RuleSet;
expect(ruleset.selectorGroup.selectors.length, 1);
expect(ruleset.declarationGroup.declarations.length, 0);
@@ -99,7 +100,7 @@
}
void testElement() {
- var errors = [];
+ var errors = <Message>[];
var input = "div {}";
var stylesheet = parseCss(input, errors: errors);
@@ -111,7 +112,7 @@
expect(stylesheet.topLevels.length, 1);
expect(stylesheet.topLevels[0] is RuleSet, true);
- var ruleset = stylesheet.topLevels[0];
+ var ruleset = stylesheet.topLevels[0] as RuleSet;
expect(ruleset.selectorGroup.selectors.length, 1);
expect(ruleset.declarationGroup.declarations.length, 0);
@@ -160,7 +161,7 @@
}
void testNamespace() {
- var errors = [];
+ var errors = <Message>[];
var input = "ns1|div {}";
var stylesheet = parseCss(input, errors: errors);
@@ -172,15 +173,15 @@
expect(stylesheet.topLevels.length, 1);
expect(stylesheet.topLevels[0] is RuleSet, true);
- var ruleset = stylesheet.topLevels[0];
+ var ruleset = stylesheet.topLevels[0] as RuleSet;
expect(ruleset.selectorGroup.selectors.length, 1);
expect(ruleset.declarationGroup.declarations.length, 0);
var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
expect(simpleSeqs.length, 1);
- var simpSelector = simpleSeqs[0].simpleSelector;
- expect(simpSelector is NamespaceSelector, true);
+ expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true);
+ var simpSelector = simpleSeqs[0].simpleSelector as NamespaceSelector;
expect(simpleSeqs[0].isCombinatorNone, true);
expect(simpSelector.isNamespaceWildcard, false);
expect(simpSelector.namespace, "ns1");
@@ -191,7 +192,7 @@
}
void testNamespace2() {
- var errors = [];
+ var errors = <Message>[];
var input = "ns1|div div ns2|span .foobar {}";
var stylesheet = parseCss(input, errors: errors);
@@ -203,7 +204,7 @@
expect(stylesheet.topLevels.length, 1);
expect(stylesheet.topLevels[0] is RuleSet, true);
- var ruleset = stylesheet.topLevels[0];
+ var ruleset = stylesheet.topLevels[0] as RuleSet;
expect(ruleset.selectorGroup.selectors.length, 1);
expect(ruleset.declarationGroup.declarations.length, 0);
@@ -211,8 +212,8 @@
expect(simpleSeqs.length, 4);
- var simpSelector0 = simpleSeqs[0].simpleSelector;
- expect(simpSelector0 is NamespaceSelector, true);
+ expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true);
+ var simpSelector0 = simpleSeqs[0].simpleSelector as NamespaceSelector;
expect(simpleSeqs[0].isCombinatorNone, true);
expect(simpSelector0.namespace, "ns1");
var elementSelector0 = simpSelector0.nameAsSimpleSelector;
@@ -225,8 +226,8 @@
expect(simpleSeqs[1].isCombinatorDescendant, true);
expect(simpSelector1.name, "div");
- var simpSelector2 = simpleSeqs[2].simpleSelector;
- expect(simpSelector2 is NamespaceSelector, true);
+ expect(simpleSeqs[2].simpleSelector is NamespaceSelector, true);
+ var simpSelector2 = simpleSeqs[2].simpleSelector as NamespaceSelector;
expect(simpleSeqs[2].isCombinatorDescendant, true);
expect(simpSelector2.namespace, "ns2");
var elementSelector2 = simpSelector2.nameAsSimpleSelector;
@@ -241,7 +242,7 @@
}
void testSelectorGroups() {
- var errors = [];
+ var errors = <Message>[];
var input =
"div, .foobar ,#elemId, .xyzzy .test, ns1|div div #elemId .foobar {}";
var stylesheet = parseCss(input, errors: errors);
@@ -254,7 +255,7 @@
expect(stylesheet.topLevels.length, 1);
expect(stylesheet.topLevels[0] is RuleSet, true);
- var ruleset = stylesheet.topLevels[0];
+ var ruleset = stylesheet.topLevels[0] as RuleSet;
expect(ruleset.selectorGroup.selectors.length, 5);
expect(ruleset.declarationGroup.declarations.length, 0);
@@ -301,8 +302,8 @@
expect(groupSelector4.simpleSelectorSequences.length, 4);
var selector40 = groupSelector4.simpleSelectorSequences[0];
- var simpleSelector40 = selector40.simpleSelector;
- expect(simpleSelector40 is NamespaceSelector, true);
+ expect(selector40.simpleSelector is NamespaceSelector, true);
+ var simpleSelector40 = selector40.simpleSelector as NamespaceSelector;
expect(selector40.isCombinatorNone, true);
expect(simpleSelector40.namespace, "ns1");
var elementSelector = simpleSelector40.nameAsSimpleSelector;
@@ -329,7 +330,7 @@
}
void testCombinator() {
- var errors = [];
+ var errors = <Message>[];
var input = ".foobar > .bar + .no-story ~ myNs|div #elemId {}";
var stylesheet = parseCss(input, errors: errors);
@@ -341,7 +342,7 @@
expect(stylesheet.topLevels.length, 1);
expect(stylesheet.topLevels[0] is RuleSet, true);
- var ruleset = stylesheet.topLevels[0];
+ var ruleset = stylesheet.topLevels[0] as RuleSet;
expect(ruleset.selectorGroup.selectors.length, 1);
expect(ruleset.declarationGroup.declarations.length, 0);
@@ -368,8 +369,8 @@
expect(simpleSelector2.name, "no-story");
var selector3 = simpleSeqs[3];
- var simpleSelector3 = selector3.simpleSelector;
- expect(simpleSelector3 is NamespaceSelector, true);
+ expect(selector3.simpleSelector is NamespaceSelector, true);
+ var simpleSelector3 = selector3.simpleSelector as NamespaceSelector;
expect(selector3.isCombinatorTilde, true);
expect(simpleSelector3.namespace, "myNs");
var elementSelector = simpleSelector3.nameAsSimpleSelector;
@@ -385,7 +386,7 @@
}
void testWildcard() {
- var errors = [];
+ var errors = <Message>[];
var input = "* {}";
var stylesheet = parseCss(input, errors: errors);
@@ -397,7 +398,7 @@
expect(stylesheet.topLevels.length, 1);
expect(stylesheet.topLevels[0] is RuleSet, true);
- var ruleset = stylesheet.topLevels[0];
+ var ruleset = stylesheet.topLevels[0] as RuleSet;
expect(ruleset.selectorGroup.selectors.length, 1);
expect(ruleset.declarationGroup.declarations.length, 0);
@@ -429,12 +430,14 @@
expect(simpleSeqs.length, 2);
- var selector0 = simpleSeqs[0];
- var simpleSelector0 = selector0.simpleSelector;
- expect(simpleSelector0 is ElementSelector, true);
- expect(selector0.isCombinatorNone, true);
- expect(simpleSelector0.isWildcard, true);
- expect(simpleSelector0.name, "*");
+ {
+ var selector0 = simpleSeqs[0];
+ var simpleSelector0 = selector0.simpleSelector;
+ expect(simpleSelector0 is ElementSelector, true);
+ expect(selector0.isCombinatorNone, true);
+ expect(simpleSelector0.isWildcard, true);
+ expect(simpleSelector0.name, "*");
+ }
var selector1 = simpleSeqs[1];
var simpleSelector1 = selector1.simpleSelector;
@@ -461,15 +464,17 @@
expect(simpleSeqs.length, 2);
- selector0 = simpleSeqs[0];
- simpleSelector0 = selector0.simpleSelector;
- expect(simpleSelector0 is NamespaceSelector, true);
- expect(selector0.isCombinatorNone, true);
- expect(simpleSelector0.isNamespaceWildcard, false);
- var elementSelector = simpleSelector0.nameAsSimpleSelector;
- expect("myNs", simpleSelector0.namespace);
- expect(elementSelector.isWildcard, true);
- expect("*", elementSelector.name);
+ {
+ var selector0 = simpleSeqs[0];
+ expect(selector0.simpleSelector is NamespaceSelector, true);
+ var simpleSelector0 = selector0.simpleSelector as NamespaceSelector;
+ expect(selector0.isCombinatorNone, true);
+ expect(simpleSelector0.isNamespaceWildcard, false);
+ var elementSelector = simpleSelector0.nameAsSimpleSelector;
+ expect("myNs", simpleSelector0.namespace);
+ expect(elementSelector.isWildcard, true);
+ expect("*", elementSelector.name);
+ }
selector1 = simpleSeqs[1];
simpleSelector1 = selector1.simpleSelector;
@@ -494,15 +499,17 @@
expect(simpleSeqs.length, 2);
- selector0 = simpleSeqs[0];
- simpleSelector0 = selector0.simpleSelector;
- expect(simpleSelector0 is NamespaceSelector, true);
- expect(selector0.isCombinatorNone, true);
- expect(simpleSelector0.isNamespaceWildcard, true);
- expect("*", simpleSelector0.namespace);
- elementSelector = simpleSelector0.nameAsSimpleSelector;
- expect(elementSelector.isWildcard, true);
- expect("*", elementSelector.name);
+ {
+ var selector0 = simpleSeqs[0];
+ expect(selector0.simpleSelector is NamespaceSelector, true);
+ var simpleSelector0 = selector0.simpleSelector as NamespaceSelector;
+ expect(selector0.isCombinatorNone, true);
+ expect(simpleSelector0.isNamespaceWildcard, true);
+ expect("*", simpleSelector0.namespace);
+ var elementSelector = simpleSelector0.nameAsSimpleSelector;
+ expect(elementSelector.isWildcard, true);
+ expect("*", elementSelector.name);
+ }
selector1 = simpleSeqs[1];
simpleSelector1 = selector1.simpleSelector;
@@ -513,7 +520,7 @@
/** Test List<int> as input to parser. */
void testArrayOfChars() {
- var errors = [];
+ var errors = <Message>[];
var input = '<![CDATA[.foo { '
'color: red; left: 20px; top: 20px; width: 100px; height:200px'
'}'
@@ -541,7 +548,7 @@
}
void testPseudo() {
- var errors = [];
+ var errors = <Message>[];
final input = r'''
html:lang(fr-ca) { quotes: '" ' ' "' }
@@ -643,7 +650,7 @@
}
void testHost() {
- var errors = [];
+ var errors = <Message>[];
var input = '@host { '
':scope {'
'white-space: nowrap;'
@@ -678,7 +685,7 @@
}
void testStringEscape() {
- var errors = [];
+ var errors = <Message>[];
var input = r'''a { foo: '{"text" : "a\\\""}' }''';
var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
expect(stylesheet != null, true);
@@ -692,7 +699,7 @@
// TODO(terry): Move to emitter_test.dart when real emitter exist.
void testEmitter() {
- var errors = [];
+ var errors = <Message>[];
var input = '.foo { '
'color: red; left: 20px; top: 20px; width: 100px; height:200px'
'}'
diff --git a/test/declaration_test.dart b/test/declaration_test.dart
index de589d7..a553522 100644
--- a/test/declaration_test.dart
+++ b/test/declaration_test.dart
@@ -4,12 +4,14 @@
library declaration_test;
+import 'package:csslib/src/messages.dart';
+import 'package:csslib/visitor.dart';
import 'package:test/test.dart';
import 'testing.dart';
void testSimpleTerms() {
- var errors = [];
+ var errors = <Message>[];
final String input = r'''
@ import url("test.css");
.foo {
@@ -64,7 +66,7 @@
* no quotes. Hex values with # and letters, and functions (rgba, url, etc.)
*/
void testDeclarations() {
- var errors = [];
+ var errors = <Message>[];
final String input = r'''
.more {
color: white;
@@ -102,7 +104,7 @@
}
void testIdentifiers() {
- var errors = [];
+ var errors = <Message>[];
final String input = r'''
#da {
height: 100px;
@@ -129,7 +131,7 @@
}
void testComposites() {
- var errors = [];
+ var errors = <Message>[];
final String input = r'''
.xyzzy {
border: 10px 80px 90px 100px;
@@ -158,7 +160,7 @@
}
void testUnits() {
- var errors = [];
+ var errors = <Message>[];
final String input = r'''
#id-1 {
transition: color 0.4s;
@@ -242,7 +244,7 @@
}
void testUnicode() {
- var errors = [];
+ var errors = <Message>[];
final String input = r'''
.toggle:after {
content: '✔';
@@ -270,7 +272,7 @@
}
void testNewerCss() {
- var errors = [];
+ var errors = <Message>[];
final String input = r'''
@media screen,print {
.foobar_screen {
@@ -317,7 +319,7 @@
}
void testMediaQueries() {
- var errors = [];
+ var errors = <Message>[];
String input = '''
@media screen and (-webkit-min-device-pixel-ratio:0) {
.todo-item .toggle {
@@ -435,7 +437,7 @@
}
void testFontFace() {
- var errors = [];
+ var errors = <Message>[];
final String input = '''
@font-face {
@@ -527,7 +529,7 @@
}
void testCssFile() {
- var errors = [];
+ var errors = <Message>[];
final String input = r'''
@import 'simple.css'
@import "test.css" print
@@ -591,7 +593,7 @@
}
void testCompactEmitter() {
- var errors = [];
+ var errors = <Message>[];
// Check !import compactly emitted.
final String input = r'''
@@ -619,7 +621,7 @@
}
void testNotSelectors() {
- var errors = [];
+ var errors = <Message>[];
final String input = r'''
.details:not(.open-details) x-element,
@@ -709,7 +711,7 @@
}
void testIE() {
- var errors = [];
+ var errors = <Message>[];
final String input = ".test {\n"
" filter: progid:DXImageTransform.Microsoft.gradient"
"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
@@ -785,7 +787,7 @@
* background: red\9;
*/
void testIEDeclaration() {
- var errors = [];
+ var errors = <Message>[];
final input = '''
.testIE-6 {
@@ -951,7 +953,7 @@
}
void testHangs() {
- var errors = [];
+ var errors = <Message>[];
// Bad hexvalue had caused a hang in processTerm.
final input = r'''#a { color: #ebebeburl(0/IE8+9+); }''';
@@ -1008,36 +1010,48 @@
void testExpressionSpans() {
final input = r'''.foo { width: 50px; }''';
var stylesheet = parseCss(input);
- var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+ var decl = (stylesheet.topLevels.single as RuleSet)
+ .declarationGroup
+ .declarations
+ .single;
// This passes
expect(decl.span.text, 'width: 50px');
// This currently fails
- expect(decl.expression.span.text, '50px');
+ expect((decl as Declaration).expression.span.text, '50px');
}
void simpleCalc() {
final input = r'''.foo { height: calc(100% - 55px); }''';
var stylesheet = parseCss(input);
- var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+ var decl = (stylesheet.topLevels.single as RuleSet)
+ .declarationGroup
+ .declarations
+ .single;
expect(decl.span.text, 'height: calc(100% - 55px)');
}
void complexCalc() {
final input = r'''.foo { left: calc((100%/3 - 2) * 1em - 2 * 1px); }''';
var stylesheet = parseCss(input);
- var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+ var decl = (stylesheet.topLevels.single as RuleSet)
+ .declarationGroup
+ .declarations
+ .single;
expect(decl.span.text, 'left: calc((100%/3 - 2) * 1em - 2 * 1px)');
}
void twoCalcs() {
final input = r'''.foo { margin: calc(1rem - 2px) calc(1rem - 1px); }''';
var stylesheet = parseCss(input);
- var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+ var decl = (stylesheet.topLevels.single as RuleSet)
+ .declarationGroup
+ .declarations
+ .single;
expect(decl.span.text, 'margin: calc(1rem - 2px) calc(1rem - 1px)');
}
void selectorWithCalcs() {
- var errors = [];
+ var errors = <Message>[];
final String input = r'''
.foo {
width: calc(1em + 5 * 2em);
@@ -1079,7 +1093,7 @@
test('Hanging bugs', testHangs);
test('Expression spans', testExpressionSpans,
skip: 'expression spans are broken'
- ' (https://github.com/dart-lang/csslib/issues/15)');
+ ' (https://github.com/dart-lang/csslib/issues/15)');
group('calc function', () {
test('simple calc', simpleCalc);
test('single complex', complexCalc);
@@ -1087,4 +1101,3 @@
test('selector with many calc declarations', selectorWithCalcs);
});
}
-
diff --git a/test/error_test.dart b/test/error_test.dart
index fc9ecf6..9815b1b 100644
--- a/test/error_test.dart
+++ b/test/error_test.dart
@@ -13,7 +13,7 @@
* Test for unsupported font-weights values of bolder, lighter and inherit.
*/
void testUnsupportedFontWeights() {
- var errors = [];
+ var errors = <Message>[];
// TODO(terry): Need to support bolder.
// font-weight value bolder.
@@ -70,7 +70,7 @@
* inherit.
*/
void testUnsupportedLineHeights() {
- var errors = [];
+ var errors = <Message>[];
// line-height value in percentge unit.
var input = ".foobar { line-height: 120%; }";
@@ -122,7 +122,7 @@
/** Test for bad selectors. */
void testBadSelectors() {
- var errors = [];
+ var errors = <Message>[];
// Invalid id selector.
var input = "# foo { color: #ff00ff; }";
@@ -157,7 +157,7 @@
/** Test for bad hex values. */
void testBadHexValues() {
- var errors = [];
+ var errors = <Message>[];
// Invalid hex value.
var input = ".foobar { color: #AH787; }";
@@ -227,7 +227,7 @@
}
void testBadUnicode() {
- var errors = [];
+ var errors = <Message>[];
final String input = '''
@font-face {
src: url(fonts/BBCBengali.ttf) format("opentype");
@@ -259,7 +259,7 @@
}
void testBadNesting() {
- var errors = [];
+ var errors = <Message>[];
// Test for bad declaration in a nested rule.
final String input = '''
diff --git a/test/extend_test.dart b/test/extend_test.dart
index 49c8a9c..afec062 100644
--- a/test/extend_test.dart
+++ b/test/extend_test.dart
@@ -4,12 +4,13 @@
library extend_test;
+import 'package:csslib/src/messages.dart';
import 'package:test/test.dart';
import 'testing.dart';
compileAndValidate(String input, String generated) {
- var errors = [];
+ var errors = <Message>[];
var stylesheet = compileCss(input, errors: errors, opts: options);
expect(stylesheet != null, true);
expect(errors.isEmpty, true, reason: errors.toString());
diff --git a/test/mixin_test.dart b/test/mixin_test.dart
index c94c9c0..71dcc50 100644
--- a/test/mixin_test.dart
+++ b/test/mixin_test.dart
@@ -4,12 +4,13 @@
library mixin_test;
+import 'package:csslib/src/messages.dart';
import 'package:test/test.dart';
import 'testing.dart';
compileAndValidate(String input, String generated) {
- var errors = [];
+ var errors = <Message>[];
var stylesheet = compileCss(input, errors: errors, opts: options);
expect(stylesheet != null, true);
expect(errors.isEmpty, true, reason: errors.toString());
@@ -17,7 +18,7 @@
}
compilePolyfillAndValidate(String input, String generated) {
- var errors = [];
+ var errors = <Message>[];
var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
expect(stylesheet != null, true);
expect(errors.isEmpty, true, reason: errors.toString());
@@ -413,7 +414,7 @@
}
void badDeclarationInclude() {
- final errors = [];
+ final errors = <Message>[];
final input = r'''
@mixin a {
#foo-id {
@@ -441,7 +442,7 @@
}
void badTopInclude() {
- final errors = [];
+ final errors = <Message>[];
final input = r'''
@mixin b {
color: red;
@@ -467,7 +468,7 @@
}
void emptyMixin() {
- final errors = [];
+ final errors = <Message>[];
final input = r'''
@mixin a {
}
@@ -492,7 +493,7 @@
}
void undefinedTopLevel() {
- final errors = [];
+ final errors = <Message>[];
final input = r'''
@mixin a {
@include b;
@@ -520,7 +521,7 @@
}
void undefinedDeclaration() {
- final errors = [];
+ final errors = <Message>[];
final input = r'''
@mixin a {
@include b;
@@ -578,7 +579,7 @@
color: #f00;
}''');
- var errors = [];
+ var errors = <Message>[];
var input = r'''
@mixin a {
foo { color: red }
diff --git a/test/nested_test.dart b/test/nested_test.dart
index 1848ef1..a5cadab 100644
--- a/test/nested_test.dart
+++ b/test/nested_test.dart
@@ -4,12 +4,13 @@
library nested_test;
+import 'package:csslib/src/messages.dart';
import 'package:test/test.dart';
import 'testing.dart';
compileAndValidate(String input, String generated) {
- var errors = [];
+ var errors = <Message>[];
var stylesheet = compileCss(input, errors: errors, opts: simpleOptions);
expect(stylesheet != null, true);
expect(errors.isEmpty, true, reason: errors.toString());
diff --git a/test/selector_test.dart b/test/selector_test.dart
index aefab16..6249d31 100644
--- a/test/selector_test.dart
+++ b/test/selector_test.dart
@@ -5,12 +5,13 @@
library selector_test;
import 'package:csslib/parser.dart';
+import 'package:csslib/src/messages.dart';
import 'package:test/test.dart';
import 'testing.dart';
void testSelectorSuccesses() {
- var errors = [];
+ var errors = <Message>[];
var selectorAst = selector('#div .foo', errors: errors);
expect(errors.isEmpty, true, reason: errors.toString());
expect('#div .foo', compactOuptut(selectorAst));
@@ -50,7 +51,7 @@
// TODO(terry): Move this failure case to a failure_test.dart when the analyzer
// and validator exit then they'll be a bunch more checks.
void testSelectorFailures() {
- var errors = [];
+ var errors = <Message>[];
// Test for invalid class name (can't start with number).
selector('.foobar .1a-story .xyzzy', errors: errors);
diff --git a/test/var_test.dart b/test/var_test.dart
index d47fd78..c75de56 100644
--- a/test/var_test.dart
+++ b/test/var_test.dart
@@ -4,12 +4,13 @@
library var_test;
+import 'package:csslib/src/messages.dart';
import 'package:test/test.dart';
import 'testing.dart';
compileAndValidate(String input, String generated) {
- var errors = [];
+ var errors = <Message>[];
var stylesheet = compileCss(input, errors: errors, opts: options);
expect(stylesheet != null, true);
expect(errors.isEmpty, true, reason: errors.toString());
@@ -17,7 +18,7 @@
}
compilePolyfillAndValidate(String input, String generated) {
- var errors = [];
+ var errors = <Message>[];
var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
expect(stylesheet != null, true);
expect(errors.isEmpty, true, reason: errors.toString());
@@ -340,7 +341,7 @@
}
void undefinedVars() {
- final errors = [];
+ final errors = <Message>[];
final input = ''':root {
var-color-background: red;
var-color-foreground: blue;
@@ -622,7 +623,7 @@
}
testVar() {
- final errors = [];
+ final errors = <Message>[];
final input = '''
@color-background: red;
@color-foreground: blue;
@@ -676,7 +677,7 @@
}
testLess() {
- final errors = [];
+ final errors = <Message>[];
final input = '''
@color-background: red;
@color-foreground: blue;
@@ -772,7 +773,7 @@
}
void includes() {
- var errors = [];
+ var errors = <Message>[];
var file1Input = r'''
:root {
var-redef: #0f0;
diff --git a/test/visitor_test.dart b/test/visitor_test.dart
index 803b106..02784c4 100644
--- a/test/visitor_test.dart
+++ b/test/visitor_test.dart
@@ -4,6 +4,7 @@
library visitor_test;
+import 'package:csslib/src/messages.dart';
import 'package:csslib/visitor.dart';
import 'package:test/test.dart';
@@ -33,7 +34,7 @@
}
void testClassVisitors() {
- var errors = [];
+ var errors = <Message>[];
var in1 = '.foobar { }';
var s = parseCss(in1, errors: errors);
@@ -84,7 +85,7 @@
(new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString();
void testPolyFill() {
- var errors = [];
+ var errors = <Message>[];
final input = r'''
.foobar { }
div.xyzzy { }