5
5
/// The models used to represent Dart code
6
6
library dartdoc.models;
7
7
8
- import 'package:analyzer/src/generated/ast.dart' ;
8
+ import 'package:analyzer/src/generated/ast.dart' show AnnotatedNode, Annotation ;
9
9
import 'package:analyzer/src/generated/element.dart' ;
10
- import 'package:analyzer/src/generated/resolver.dart' ;
10
+ import 'package:analyzer/src/generated/resolver.dart'
11
+ show Namespace, NamespaceBuilder, InheritanceManager, MemberMap;
11
12
import 'package:analyzer/src/generated/utilities_dart.dart' show ParameterKind;
12
- import 'package:quiver/core.dart' ;
13
+ import 'package:quiver/core.dart' show hash3 ;
13
14
14
- import 'html_utils.dart' ;
15
- import 'model_utils.dart' ;
16
- import 'package_meta.dart' ;
15
+ import 'html_utils.dart' show stripComments, htmlEscape ;
16
+ import 'model_utils.dart' show isPrivate, isPublic, getAllSupertypes ;
17
+ import 'package_meta.dart' show PackageMeta, FileContents ;
17
18
18
- import '../markdown_processor.dart' ;
19
+ import '../markdown_processor.dart' show Documentation, renderMarkdownToHtml ;
19
20
20
- int byName (a, b) => a.name.toUpperCase ().compareTo (b.name.toUpperCase ());
21
+ int byName (Nameable a, Nameable b) =>
22
+ a.name.toUpperCase ().compareTo (b.name.toUpperCase ());
21
23
22
24
final Map <Class , List <Class >> _implementors = new Map ();
23
25
@@ -48,7 +50,19 @@ void _addToImplementors(Class c) {
48
50
}
49
51
}
50
52
51
- abstract class ModelElement implements Comparable {
53
+ /// An element that is enclosed by some other element.
54
+ ///
55
+ /// Libraries are not enclosed.
56
+ abstract class EnclosedElement {
57
+ ModelElement get enclosingElement;
58
+ }
59
+
60
+ /// Something that has a name.
61
+ abstract class Nameable {
62
+ String get name;
63
+ }
64
+
65
+ abstract class ModelElement implements Comparable , Nameable {
52
66
final Element element;
53
67
final Library library;
54
68
@@ -359,14 +373,17 @@ abstract class ModelElement implements Comparable {
359
373
}
360
374
}
361
375
376
+ // TODO: how do we get rid of this class?
362
377
class Dynamic extends ModelElement {
363
378
Dynamic (DynamicElementImpl element, Library library)
364
379
: super (element, library);
365
380
381
+ ModelElement get enclosingElement => throw new UnsupportedError ('' );
382
+
366
383
String get _href => throw new StateError ('dynamic should not have an href' );
367
384
}
368
385
369
- class Package {
386
+ class Package implements Nameable {
370
387
final List <Library > _libraries = [];
371
388
final PackageMeta packageMeta;
372
389
String _docsAsHtml;
@@ -503,6 +520,9 @@ class Library extends ModelElement {
503
520
return library;
504
521
}
505
522
523
+ /// Libraries are not enclosed by anything.
524
+ ModelElement get enclosingElement => null ;
525
+
506
526
Library get library => this ;
507
527
508
528
Iterable <Element > get _exportedNamespace {
@@ -729,7 +749,7 @@ class Library extends ModelElement {
729
749
String get _href => '$dirName /$fileName ' ;
730
750
}
731
751
732
- class Class extends ModelElement {
752
+ class Class extends ModelElement implements EnclosedElement {
733
753
List <ElementType > _mixins;
734
754
ElementType _supertype;
735
755
List <ElementType > _interfaces;
@@ -797,6 +817,9 @@ class Class extends ModelElement {
797
817
}).where ((it) => it != null ).toList (growable: false );
798
818
}
799
819
820
+ /// Returns the library that encloses this element.
821
+ ModelElement get enclosingElement => library;
822
+
800
823
String get nameWithGenerics {
801
824
if (! modelType.isParameterizedType) return name;
802
825
return '$name <${_typeParameters .map ((t ) => t .name ).join (', ' )}>' ;
@@ -1271,12 +1294,16 @@ abstract class SourceCodeMixin {
1271
1294
Element get element;
1272
1295
}
1273
1296
1274
- class ModelFunction extends ModelElement with SourceCodeMixin {
1297
+ class ModelFunction extends ModelElement
1298
+ with SourceCodeMixin
1299
+ implements EnclosedElement {
1275
1300
ModelFunction (FunctionElement element, Library library)
1276
1301
: super (element, library) {
1277
1302
_modelType = new ElementType (_func.type, this );
1278
1303
}
1279
1304
1305
+ ModelElement get enclosingElement => library;
1306
+
1280
1307
FunctionElement get _func => (element as FunctionElement );
1281
1308
1282
1309
bool get isStatic => _func.isStatic;
@@ -1289,7 +1316,7 @@ class ModelFunction extends ModelElement with SourceCodeMixin {
1289
1316
String get _href => '${library .dirName }/$fileName ' ;
1290
1317
}
1291
1318
1292
- class Typedef extends ModelElement {
1319
+ class Typedef extends ModelElement implements EnclosedElement {
1293
1320
FunctionTypeAliasElement get _typedef =>
1294
1321
(element as FunctionTypeAliasElement );
1295
1322
@@ -1300,6 +1327,9 @@ class Typedef extends ModelElement {
1300
1327
}
1301
1328
}
1302
1329
1330
+ @override
1331
+ ModelElement get enclosingElement => library;
1332
+
1303
1333
String get fileName => '$name .html' ;
1304
1334
1305
1335
String get linkedReturnType => modelType != null
@@ -1309,7 +1339,7 @@ class Typedef extends ModelElement {
1309
1339
String get _href => '${library .dirName }/$fileName ' ;
1310
1340
}
1311
1341
1312
- class Field extends ModelElement {
1342
+ class Field extends ModelElement implements EnclosedElement {
1313
1343
String _constantValue;
1314
1344
bool _isInherited = false ;
1315
1345
@@ -1325,6 +1355,10 @@ class Field extends ModelElement {
1325
1355
_setModelType ();
1326
1356
}
1327
1357
1358
+ @override
1359
+ ModelElement get enclosingElement =>
1360
+ new ModelElement .from (_field.enclosingElement, library);
1361
+
1328
1362
@override
1329
1363
String get _computeDocumentationComment {
1330
1364
var buffer = new StringBuffer ();
@@ -1436,12 +1470,16 @@ class EnumField extends Field {
1436
1470
String get linkedName => name;
1437
1471
}
1438
1472
1439
- class Constructor extends ModelElement {
1473
+ class Constructor extends ModelElement implements EnclosedElement {
1440
1474
ConstructorElement get _constructor => (element as ConstructorElement );
1441
1475
1442
1476
Constructor (ConstructorElement element, Library library)
1443
1477
: super (element, library);
1444
1478
1479
+ @override
1480
+ ModelElement get enclosingElement =>
1481
+ new ModelElement .from (_constructor.enclosingElement, library);
1482
+
1445
1483
@override
1446
1484
String get _href =>
1447
1485
'${library .dirName }/${_constructor .enclosingElement .name }/$name .html' ;
@@ -1468,7 +1506,9 @@ class Constructor extends ModelElement {
1468
1506
}
1469
1507
}
1470
1508
1471
- class Method extends ModelElement with SourceCodeMixin {
1509
+ class Method extends ModelElement
1510
+ with SourceCodeMixin
1511
+ implements EnclosedElement {
1472
1512
bool _isInherited = false ;
1473
1513
1474
1514
MethodElement get _method => (element as MethodElement );
@@ -1483,6 +1523,10 @@ class Method extends ModelElement with SourceCodeMixin {
1483
1523
_isInherited = true ;
1484
1524
}
1485
1525
1526
+ @override
1527
+ ModelElement get enclosingElement =>
1528
+ new ModelElement .from (_method.enclosingElement, library);
1529
+
1486
1530
Method get overriddenElement {
1487
1531
ClassElement parent = element.enclosingElement;
1488
1532
for (InterfaceType t in getAllSupertypes (parent)) {
@@ -1563,12 +1607,16 @@ class Operator extends Method {
1563
1607
}
1564
1608
1565
1609
/// Getters and setters.
1566
- class Accessor extends ModelElement {
1610
+ class Accessor extends ModelElement implements EnclosedElement {
1567
1611
PropertyAccessorElement get _accessor => (element as PropertyAccessorElement );
1568
1612
1569
1613
Accessor (PropertyAccessorElement element, Library library)
1570
1614
: super (element, library);
1571
1615
1616
+ @override
1617
+ ModelElement get enclosingElement =>
1618
+ new ModelElement .from (_accessor.enclosingElement, library);
1619
+
1572
1620
bool get isGetter => _accessor.isGetter;
1573
1621
1574
1622
@override
@@ -1577,7 +1625,7 @@ class Accessor extends ModelElement {
1577
1625
}
1578
1626
1579
1627
/// Top-level variables. But also picks up getters and setters?
1580
- class TopLevelVariable extends ModelElement {
1628
+ class TopLevelVariable extends ModelElement implements EnclosedElement {
1581
1629
TopLevelVariableElement get _variable => (element as TopLevelVariableElement );
1582
1630
1583
1631
TopLevelVariable (TopLevelVariableElement element, Library library)
@@ -1594,6 +1642,9 @@ class TopLevelVariable extends ModelElement {
1594
1642
}
1595
1643
}
1596
1644
1645
+ @override
1646
+ ModelElement get enclosingElement => library;
1647
+
1597
1648
bool get isFinal => _variable.isFinal;
1598
1649
1599
1650
bool get isConst => _variable.isConst;
@@ -1631,14 +1682,18 @@ class TopLevelVariable extends ModelElement {
1631
1682
String get _href => '${library .dirName }/${name }.html' ;
1632
1683
}
1633
1684
1634
- class Parameter extends ModelElement {
1685
+ class Parameter extends ModelElement implements EnclosedElement {
1635
1686
Parameter (ParameterElement element, Library library)
1636
1687
: super (element, library) {
1637
1688
var t = _parameter.type;
1638
1689
_modelType = new ElementType (
1639
1690
t, new ModelElement .from (t.element, package._getLibraryFor (t.element)));
1640
1691
}
1641
1692
1693
+ @override
1694
+ ModelElement get enclosingElement =>
1695
+ new ModelElement .from (_parameter.enclosingElement, library);
1696
+
1642
1697
ParameterElement get _parameter => element as ParameterElement ;
1643
1698
1644
1699
bool get isOptional => _parameter.parameterKind.isOptional;
0 commit comments