Skip to content

Commit 58f71d2

Browse files
committed
Fixed all the compilation errors, tests still broken.
1 parent 395685e commit 58f71d2

15 files changed

+311
-44
lines changed

lib/xml.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ export 'xml/nodes/processing.dart' show XmlProcessing;
2323
export 'xml/nodes/text.dart' show XmlText;
2424
export 'xml/parser.dart' show XmlParserDefinition;
2525
export 'xml/utils/attribute_type.dart' show XmlAttributeType;
26-
export 'xml/utils/child.dart' show XmlOwned;
2726
export 'xml/utils/name.dart' show XmlName;
2827
export 'xml/utils/named.dart' show XmlNamed;
2928
export 'xml/utils/node_type.dart' show XmlNodeType;
29+
export 'xml/utils/owned.dart' show XmlOwned;
3030
export 'xml/utils/writable.dart' show XmlWritable;
3131
export 'xml/visitors/transformer.dart' show XmlTransformer;
3232
export 'xml/visitors/visitable.dart' show XmlVisitable;

lib/xml/builder.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,13 +214,13 @@ class XmlBuilder {
214214
text(value.text);
215215
} else if (value is XmlAttribute) {
216216
// Attributes must be copied and added to the attributes list.
217-
_stack.last.attributes.add(new XmlTransformer().visit(value));
217+
_stack.last.attributes.add(const XmlTransformer().visit(value));
218218
} else if (value is XmlDocumentFragment) {
219219
// Document fragments need to be unwrapped.
220220
value.children.forEach(_insert);
221221
} else if (value is XmlElement || value is XmlData) {
222222
// All other valid nodes must be copied and added to the children list.
223-
_stack.last.children.add(new XmlTransformer().visit(value));
223+
_stack.last.children.add(const XmlTransformer().visit(value));
224224
} else {
225225
throw new ArgumentError('Unable to add element of type ${value.nodeType}');
226226
}

lib/xml/nodes/attribute.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class XmlAttribute extends XmlNode implements XmlNamed {
2020

2121
/// Create an attribute with `name` and `value`.
2222
XmlAttribute(this.name, this.value, [this.attributeType = XmlAttributeType.DOUBLE_QUOTE]) {
23-
name.adoptParent(this);
23+
name.attachParent(this);
2424
}
2525

2626
@override

lib/xml/nodes/document.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ import 'package:xml/xml/visitors/visitor.dart' show XmlVisitor;
99

1010
/// XML document node.
1111
class XmlDocument extends XmlParent {
12+
1213
/// Create a document node with `children`.
13-
XmlDocument(Iterable<XmlNode> children) : super(children);
14+
XmlDocument(Iterable<XmlNode> children) : super(childrenNodeTypes, children);
1415

1516
/// Return the [XmlDoctype] element, or `null` if not defined.
1617
///
@@ -47,3 +48,13 @@ class XmlDocument extends XmlParent {
4748
@override
4849
E accept<E>(XmlVisitor<E> visitor) => visitor.visitDocument(this);
4950
}
51+
52+
/// Supported child node types.
53+
final childrenNodeTypes = new Set.from([
54+
XmlNodeType.CDATA,
55+
XmlNodeType.COMMENT,
56+
XmlNodeType.DOCUMENT_TYPE,
57+
XmlNodeType.ELEMENT,
58+
XmlNodeType.PROCESSING,
59+
XmlNodeType.TEXT,
60+
]);

lib/xml/nodes/document_fragment.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ import 'package:xml/xml/visitors/visitor.dart' show XmlVisitor;
88

99
/// XML document fragment node.
1010
class XmlDocumentFragment extends XmlParent {
11-
/// Create a document node with `children`.
12-
XmlDocumentFragment(Iterable<XmlNode> children) : super(children);
11+
12+
/// Create a document fragment node with `children`.
13+
XmlDocumentFragment(Iterable<XmlNode> children) : super(childrenNodeTypes, children);
1314

1415
@override
1516
XmlDocument get document => null;
@@ -23,3 +24,13 @@ class XmlDocumentFragment extends XmlParent {
2324
@override
2425
E accept<E>(XmlVisitor<E> visitor) => visitor.visitDocumentFragment(this);
2526
}
27+
28+
/// Supported child node types.
29+
final childrenNodeTypes = new Set.from([
30+
XmlNodeType.CDATA,
31+
XmlNodeType.COMMENT,
32+
XmlNodeType.DOCUMENT_TYPE,
33+
XmlNodeType.ELEMENT,
34+
XmlNodeType.PROCESSING,
35+
XmlNodeType.TEXT,
36+
]);

lib/xml/nodes/element.dart

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,37 @@
11
library xml.nodes.element;
22

3-
import 'dart:collection';
4-
53
import 'package:xml/xml/nodes/attribute.dart' show XmlAttribute;
64
import 'package:xml/xml/nodes/node.dart' show XmlNode;
75
import 'package:xml/xml/nodes/parent.dart' show XmlParent;
86
import 'package:xml/xml/utils/name.dart' show XmlName;
97
import 'package:xml/xml/utils/name_matcher.dart' show createNameMatcher;
108
import 'package:xml/xml/utils/named.dart' show XmlNamed;
9+
import 'package:xml/xml/utils/node_list.dart' show XmlNodeList;
1110
import 'package:xml/xml/utils/node_type.dart' show XmlNodeType;
1211
import 'package:xml/xml/visitors/visitor.dart' show XmlVisitor;
1312

1413
/// XML element node.
1514
class XmlElement extends XmlParent implements XmlNamed {
15+
16+
final XmlName _name;
17+
18+
final XmlNodeList<XmlAttribute> _attributes = new XmlNodeList(attributeNodeTypes);
19+
20+
/// Create an element node with the provided `name`, `attributes`, and `children`.
21+
XmlElement(this._name, Iterable<XmlAttribute> attributes, Iterable<XmlNode> children)
22+
: super(childrenNodeTypes, children) {
23+
_name.attachParent(this);
24+
_attributes.attachParent(this);
25+
_attributes.addAll(attributes);
26+
}
27+
28+
/// Return the name of the node.
1629
@override
17-
final XmlName name;
30+
XmlName get name => _name;
1831

32+
/// Return the attribute nodes of this node.
1933
@override
20-
final List<XmlAttribute> attributes;
21-
22-
/// Create an [XmlElement] with the given `name`, `attributes`, and `children`.
23-
XmlElement(this.name, Iterable<XmlAttribute> attributes, Iterable<XmlNode> children)
24-
: attributes = new UnmodifiableListView(attributes.toList(growable: false)),
25-
super(children) {
26-
name.adoptParent(this);
27-
for (var attribute in this.attributes) {
28-
attribute.adoptParent(this);
29-
}
30-
}
34+
List<XmlAttribute> get attributes => _attributes;
3135

3236
/// Return the attribute value with the given `name`.
3337
String getAttribute(String name, {String namespace}) {
@@ -36,12 +40,25 @@ class XmlElement extends XmlParent implements XmlNamed {
3640
}
3741

3842
/// Return the attribute node with the given `name`.
39-
XmlAttribute getAttributeNode(String name, {String namespace}) =>
40-
attributes.firstWhere(createNameMatcher(name, namespace), orElse: () => null);
43+
XmlAttribute getAttributeNode(String name, {String namespace}) {
44+
return _attributes.firstWhere(createNameMatcher(name, namespace), orElse: () => null);
45+
}
4146

4247
@override
4348
XmlNodeType get nodeType => XmlNodeType.ELEMENT;
4449

4550
@override
4651
E accept<E>(XmlVisitor<E> visitor) => visitor.visitElement(this);
4752
}
53+
54+
/// Supported child node types.
55+
final childrenNodeTypes = new Set.from([
56+
XmlNodeType.CDATA,
57+
XmlNodeType.COMMENT,
58+
XmlNodeType.ELEMENT,
59+
XmlNodeType.PROCESSING,
60+
XmlNodeType.TEXT,
61+
]);
62+
63+
/// Supported attribute node types.
64+
final attributeNodeTypes = new Set.from([XmlNodeType.ATTRIBUTE]);

lib/xml/nodes/node.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ import 'package:xml/xml/nodes/attribute.dart' show XmlAttribute;
88
import 'package:xml/xml/nodes/cdata.dart' show XmlCDATA;
99
import 'package:xml/xml/nodes/document.dart' show XmlDocument;
1010
import 'package:xml/xml/nodes/text.dart' show XmlText;
11-
import 'package:xml/xml/utils/child.dart' show XmlOwned;
1211
import 'package:xml/xml/utils/node_type.dart' show XmlNodeType;
12+
import 'package:xml/xml/utils/owned.dart' show XmlOwned;
1313
import 'package:xml/xml/utils/writable.dart' show XmlWritable;
1414
import 'package:xml/xml/visitors/visitable.dart' show XmlVisitable;
15+
import 'package:xml/xml/visitors/transformer.dart' show XmlTransformer;
1516

1617
/// Immutable abstract XML node.
1718
abstract class XmlNode extends Object with XmlVisitable, XmlWritable, XmlOwned {
@@ -81,4 +82,7 @@ abstract class XmlNode extends Object with XmlVisitable, XmlWritable, XmlOwned {
8182
}
8283
return null;
8384
}
85+
86+
/// Return a copy of this node.
87+
XmlNode clone() => const XmlTransformer().visit(this);
8488
}

lib/xml/nodes/parent.dart

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
library xml.nodes.parent;
22

3-
import 'dart:collection';
4-
53
import 'package:xml/xml/nodes/element.dart' show XmlElement;
64
import 'package:xml/xml/nodes/node.dart' show XmlNode;
75
import 'package:xml/xml/utils/name_matcher.dart' show createNameMatcher;
6+
import 'package:xml/xml/utils/node_list.dart' show XmlNodeList;
7+
import 'package:xml/xml/utils/node_type.dart' show XmlNodeType;
88

99
/// Abstract XML node with actual children.
1010
abstract class XmlParent extends XmlNode {
11-
@override
12-
final List<XmlNode> children;
11+
final XmlNodeList<XmlNode> _children;
1312

1413
/// Create a node with a list of `children`.
15-
XmlParent(Iterable<XmlNode> children)
16-
: children = new UnmodifiableListView(children.toList(growable: false)) {
17-
for (var child in this.children) {
18-
child.adoptParent(this);
19-
}
14+
XmlParent(Set<XmlNodeType> supportedChildrenTypes, Iterable<XmlNode> children)
15+
: _children = new XmlNodeList(supportedChildrenTypes) {
16+
_children.attachParent(this);
17+
_children.addAll(children);
2018
}
2119

20+
/// Return the direct children of this node.
21+
@override
22+
List<XmlNode> get children => _children;
23+
2224
/// Return the _direct_ child elements with the given tag `name`.
2325
Iterable<XmlElement> findElements(String name, {String namespace}) =>
24-
_filterElements(children, name, namespace);
26+
_filterElements(_children, name, namespace);
2527

2628
/// Return the _recursive_ child elements with the specified tag `name`.
2729
Iterable<XmlElement> findAllElements(String name, {String namespace}) =>

lib/xml/utils/errors.dart

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
library xml.utils.errors;
2+
3+
import 'package:xml/xml/nodes/node.dart' show XmlNode;
4+
import 'package:xml/xml/utils/node_type.dart' show XmlNodeType;
5+
6+
class XmlNodeTypeError extends ArgumentError {
7+
8+
static void checkValidType(XmlNode node, Iterable<XmlNodeType> validTypes) {
9+
if (!validTypes.contains(node.nodeType)) {
10+
throw new XmlNodeTypeError('Expected node of type: $validTypes');
11+
}
12+
}
13+
14+
XmlNodeTypeError(String message) : super(message);
15+
}
16+
17+
class XmlParentError extends ArgumentError {
18+
19+
static void checkAttached(XmlNode parent, XmlNode child) {
20+
if (child.parent == parent) {
21+
throw new XmlParentError('Nodes does not have a parent: $child');
22+
}
23+
}
24+
25+
static void checkDetached(XmlNode node) {
26+
if (node.hasParent) {
27+
throw new XmlParentError('Nodes does not have a parent: $node');
28+
}
29+
}
30+
31+
XmlParentError(String message) : super(message);
32+
}

lib/xml/utils/name.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
library xml.utils.name;
22

33
import 'package:xml/xml/builder.dart' show NamespaceData;
4-
import 'package:xml/xml/utils/child.dart' show XmlOwned;
4+
import 'package:xml/xml/utils/owned.dart' show XmlOwned;
55
import 'package:xml/xml/utils/prefix_name.dart' show XmlPrefixName;
66
import 'package:xml/xml/utils/simple_name.dart' show XmlSimpleName;
77
import 'package:xml/xml/utils/writable.dart' show XmlWritable;

0 commit comments

Comments
 (0)