@@ -128,7 +128,13 @@ abstract class Inheritable implements ModelElement {
128
128
ModelElement get definingEnclosingElement =>
129
129
_memoizer.memoized (_definingEnclosingElement);
130
130
131
- ModelElement _canonicalEnclosingElement () {
131
+ @override
132
+ ModelElement _canonicalModelElement () {
133
+ return canonicalEnclosingElement? .allCanonicalModelElements
134
+ ? .firstWhere ((m) => m.name == name, orElse: () => null );
135
+ }
136
+
137
+ Class _canonicalEnclosingElement () {
132
138
Class canonicalEnclosingClass;
133
139
Element searchElement = element;
134
140
if (isInherited) {
@@ -180,7 +186,7 @@ abstract class Inheritable implements ModelElement {
180
186
return canonicalEnclosingClass;
181
187
}
182
188
183
- ModelElement get canonicalEnclosingElement =>
189
+ Class get canonicalEnclosingElement =>
184
190
_memoizer.memoized (_canonicalEnclosingElement);
185
191
186
192
List <Class > get inheritance {
@@ -608,6 +614,7 @@ class Class extends ModelElement
608
614
@override
609
615
ModelElement get enclosingElement => library;
610
616
617
+ @override
611
618
String get fileName => "${name }-class.html" ;
612
619
613
620
String get fullkind {
@@ -654,8 +661,11 @@ class Class extends ModelElement
654
661
655
662
@override
656
663
String get href {
657
- if (canonicalLibrary == null ) return null ;
658
- return '${canonicalLibrary .dirName }/$fileName ' ;
664
+ if (! identical (canonicalModelElement, this ))
665
+ return canonicalModelElement? .href;
666
+ assert (canonicalLibrary != null );
667
+ assert (canonicalLibrary == library);
668
+ return '${library .dirName }/$fileName ' ;
659
669
}
660
670
661
671
/// Returns all the implementors of this class.
@@ -1132,8 +1142,11 @@ class Constructor extends ModelElement
1132
1142
1133
1143
@override
1134
1144
String get href {
1135
- if (canonicalLibrary == null ) return null ;
1136
- return '${canonicalLibrary .dirName }/${_constructor .enclosingElement .name }/$name .html' ;
1145
+ if (! identical (canonicalModelElement, this ))
1146
+ return canonicalModelElement? .href;
1147
+ assert (canonicalLibrary != null );
1148
+ assert (canonicalLibrary == library);
1149
+ return '${enclosingElement .library .dirName }/${enclosingElement .name }/$name .html' ;
1137
1150
}
1138
1151
1139
1152
@override
@@ -1346,9 +1359,12 @@ class EnumField extends Field {
1346
1359
1347
1360
@override
1348
1361
String get href {
1349
- if (canonicalLibrary == null || canonicalEnclosingElement == null )
1350
- return null ;
1351
- return '${canonicalEnclosingElement .library .dirName }/${(canonicalEnclosingElement as Class ).fileName }' ;
1362
+ if (! identical (canonicalModelElement, this ))
1363
+ return canonicalModelElement? .href;
1364
+ assert (! (canonicalLibrary == null || canonicalEnclosingElement == null ));
1365
+ assert (canonicalLibrary == library);
1366
+ assert (canonicalEnclosingElement == enclosingElement);
1367
+ return '${enclosingElement .library .dirName }/${(enclosingElement as Class ).fileName }' ;
1352
1368
}
1353
1369
1354
1370
@override
@@ -1422,19 +1438,12 @@ class Field extends ModelElement
1422
1438
1423
1439
@override
1424
1440
String get href {
1425
- String retval;
1426
- if (canonicalLibrary == null ) return null ;
1427
- if (enclosingElement is Class ) {
1428
- if (canonicalEnclosingElement == null ) return null ;
1429
- retval =
1430
- '${canonicalEnclosingElement .canonicalLibrary .dirName }/${canonicalEnclosingElement .name }/$_fileName ' ;
1431
- } else if (enclosingElement is Library ) {
1432
- retval = '${canonicalLibrary .dirName }/$_fileName ' ;
1433
- } else {
1434
- throw new StateError (
1435
- '$name is not in a class or library, instead it is a ${enclosingElement .element }' );
1436
- }
1437
- return retval;
1441
+ if (! identical (canonicalModelElement, this ))
1442
+ return canonicalModelElement? .href;
1443
+ assert (canonicalLibrary != null );
1444
+ assert (canonicalEnclosingElement == enclosingElement);
1445
+ assert (canonicalLibrary == library);
1446
+ return '${enclosingElement .library .dirName }/${enclosingElement .name }/$fileName ' ;
1438
1447
}
1439
1448
1440
1449
@override
@@ -1494,7 +1503,8 @@ class Field extends ModelElement
1494
1503
1495
1504
FieldElement get _field => (element as FieldElement );
1496
1505
1497
- String get _fileName => isConst ? '$name -constant.html' : '$name .html' ;
1506
+ @override
1507
+ String get fileName => isConst ? '$name -constant.html' : '$name .html' ;
1498
1508
1499
1509
String _sourceCode () {
1500
1510
// We could use a set to figure the dupes out, but that would lose ordering.
@@ -1906,6 +1916,7 @@ class Library extends ModelElement {
1906
1916
1907
1917
Iterable <Class > get publicExceptions => filterNonPublic (exceptions);
1908
1918
1919
+ @override
1909
1920
String get fileName => '$dirName -library.html' ;
1910
1921
1911
1922
List <ModelFunction > _functions () {
@@ -1943,8 +1954,9 @@ class Library extends ModelElement {
1943
1954
1944
1955
@override
1945
1956
String get href {
1946
- if (canonicalLibrary == null ) return null ;
1947
- return '${canonicalLibrary .dirName }/$fileName ' ;
1957
+ if (! identical (canonicalModelElement, this ))
1958
+ return canonicalModelElement? .href;
1959
+ return '${library .dirName }/$fileName ' ;
1948
1960
}
1949
1961
1950
1962
InheritanceManager _inheritanceManager () => new InheritanceManager (element);
@@ -2275,18 +2287,19 @@ class Method extends ModelElement
2275
2287
return _enclosingClass;
2276
2288
}
2277
2289
2278
- String get fileName => "${name }.html" ;
2279
-
2280
2290
String get fullkind {
2281
2291
if (_method.isAbstract) return 'abstract $kind ' ;
2282
2292
return kind;
2283
2293
}
2284
2294
2285
2295
@override
2286
2296
String get href {
2287
- if (canonicalLibrary == null || canonicalEnclosingElement == null )
2288
- return null ;
2289
- return '${canonicalEnclosingElement .canonicalLibrary .dirName }/${canonicalEnclosingElement .name }/${fileName }' ;
2297
+ if (! identical (canonicalModelElement, this ))
2298
+ return canonicalModelElement? .href;
2299
+ assert (! (canonicalLibrary == null || canonicalEnclosingElement == null ));
2300
+ assert (canonicalLibrary == library);
2301
+ assert (canonicalEnclosingElement == enclosingElement);
2302
+ return '${enclosingElement .library .dirName }/${enclosingElement .name }/${fileName }' ;
2290
2303
}
2291
2304
2292
2305
@override
@@ -2693,6 +2706,20 @@ abstract class ModelElement extends Canonicalization
2693
2706
bool get canHaveParameters =>
2694
2707
element is ExecutableElement || element is FunctionTypedElement ;
2695
2708
2709
+ ModelElement _canonicalModelElement () {
2710
+ Class preferredClass;
2711
+ if (enclosingElement is Class ) {
2712
+ preferredClass = enclosingElement;
2713
+ }
2714
+ return package.findCanonicalModelElementFor (element,
2715
+ preferredClass: preferredClass);
2716
+ }
2717
+
2718
+ // Returns the canonical ModelElement for this ModelElement, or null
2719
+ // if there isn't one.
2720
+ ModelElement get canonicalModelElement =>
2721
+ _memoizer.memoized (_canonicalModelElement);
2722
+
2696
2723
// TODO(jcollins-g): untangle when mixins can call super
2697
2724
@override
2698
2725
List <ModelElement > get documentationFrom =>
@@ -2888,6 +2915,8 @@ abstract class ModelElement extends Canonicalization
2888
2915
return '' ;
2889
2916
}
2890
2917
2918
+ String get fileName => "${name }.html" ;
2919
+
2891
2920
/// Returns the fully qualified name.
2892
2921
///
2893
2922
/// For example: libraryName.className.methodName
@@ -3559,12 +3588,13 @@ class ModelFunctionTyped extends ModelElement
3559
3588
@override
3560
3589
ModelElement get enclosingElement => library;
3561
3590
3562
- String get fileName => "$name .html" ;
3563
-
3564
3591
@override
3565
3592
String get href {
3566
- if (canonicalLibrary == null ) return null ;
3567
- return '${canonicalLibrary .dirName }/$fileName ' ;
3593
+ if (! identical (canonicalModelElement, this ))
3594
+ return canonicalModelElement? .href;
3595
+ assert (canonicalLibrary != null );
3596
+ assert (canonicalLibrary == library);
3597
+ return '${library .dirName }/$fileName ' ;
3568
3598
}
3569
3599
3570
3600
@override
@@ -4182,6 +4212,9 @@ class Package extends Canonicalization with Nameable, Warnable, Memoizeable {
4182
4212
if (e is PropertyAccessorElement ) {
4183
4213
searchElement = e.variable;
4184
4214
}
4215
+ if (e is GenericFunctionTypeElement ) {
4216
+ searchElement = e.enclosingElement;
4217
+ }
4185
4218
4186
4219
for (Library library in publicLibraries) {
4187
4220
if (library.modelElementsMap.containsKey (searchElement)) {
@@ -4211,6 +4244,10 @@ class Package extends Canonicalization with Nameable, Warnable, Memoizeable {
4211
4244
/// Tries to find a canonical ModelElement for this element. If we know
4212
4245
/// this element is related to a particular class, pass preferredClass to
4213
4246
/// disambiguate.
4247
+ ///
4248
+ /// This doesn't know anything about [Package.inheritThrough] and probably
4249
+ /// shouldn't, so using it with [Inheritable] s without special casing is
4250
+ /// not advised.
4214
4251
ModelElement findCanonicalModelElementFor (Element e, {Class preferredClass}) {
4215
4252
assert (allLibrariesAdded);
4216
4253
Library lib = findCanonicalLibraryFor (e);
@@ -4295,7 +4332,9 @@ class Package extends Canonicalization with Nameable, Warnable, Memoizeable {
4295
4332
}
4296
4333
4297
4334
assert (matches.length <= 1 );
4298
- if (! matches.isEmpty) modelElement = matches.first;
4335
+ if (matches.isNotEmpty) {
4336
+ modelElement = matches.first;
4337
+ }
4299
4338
} else {
4300
4339
if (lib != null ) {
4301
4340
Accessor getter;
@@ -4431,19 +4470,7 @@ class Parameter extends ModelElement implements EnclosedElement {
4431
4470
4432
4471
@override
4433
4472
String get href {
4434
- if (canonicalLibrary == null ) return null ;
4435
- var p = _parameter.enclosingElement;
4436
-
4437
- if (p is FunctionElement ) {
4438
- return '${canonicalLibrary .dirName }/${p .name }.html' ;
4439
- } else {
4440
- // TODO: why is this logic here?
4441
- var name = Operator .friendlyNames.containsKey (p.name)
4442
- ? Operator .friendlyNames[p.name]
4443
- : p.name;
4444
- return '${canonicalLibrary .dirName }/${p .enclosingElement .name }/' +
4445
- '${name }.html#${htmlId }' ;
4446
- }
4473
+ throw new StateError ('href not implemented for parameters' );
4447
4474
}
4448
4475
4449
4476
@override
@@ -4636,8 +4663,11 @@ class TopLevelVariable extends ModelElement
4636
4663
4637
4664
@override
4638
4665
String get href {
4639
- if (canonicalLibrary == null ) return null ;
4640
- return '${canonicalLibrary .dirName }/$_fileName ' ;
4666
+ if (! identical (canonicalModelElement, this ))
4667
+ return canonicalModelElement? .href;
4668
+ assert (canonicalLibrary != null );
4669
+ assert (canonicalLibrary == library);
4670
+ return '${library .dirName }/$fileName ' ;
4641
4671
}
4642
4672
4643
4673
@override
@@ -4664,7 +4694,8 @@ class TopLevelVariable extends ModelElement
4664
4694
return docs;
4665
4695
}
4666
4696
4667
- String get _fileName => isConst ? '$name -constant.html' : '$name .html' ;
4697
+ @override
4698
+ String get fileName => isConst ? '$name -constant.html' : '$name .html' ;
4668
4699
4669
4700
TopLevelVariableElement get _variable => (element as TopLevelVariableElement );
4670
4701
}
@@ -4678,8 +4709,6 @@ class Typedef extends ModelElement
4678
4709
@override
4679
4710
ModelElement get enclosingElement => library;
4680
4711
4681
- String get fileName => '$name .html' ;
4682
-
4683
4712
@override
4684
4713
String get nameWithGenerics => '$name ${super .genericParameters }' ;
4685
4714
@@ -4697,8 +4726,11 @@ class Typedef extends ModelElement
4697
4726
4698
4727
@override
4699
4728
String get href {
4700
- if (canonicalLibrary == null ) return null ;
4701
- return '${canonicalLibrary .dirName }/$fileName ' ;
4729
+ if (! identical (canonicalModelElement, this ))
4730
+ return canonicalModelElement? .href;
4731
+ assert (canonicalLibrary != null );
4732
+ assert (canonicalLibrary == library);
4733
+ return '${library .dirName }/$fileName ' ;
4702
4734
}
4703
4735
4704
4736
// Food for mustache.
@@ -4730,8 +4762,11 @@ class TypeParameter extends ModelElement {
4730
4762
4731
4763
@override
4732
4764
String get href {
4733
- if (canonicalLibrary == null ) return null ;
4734
- return '${canonicalLibrary .dirName }/${_typeParameter .enclosingElement .name }/$name ' ;
4765
+ if (! identical (canonicalModelElement, this ))
4766
+ return canonicalModelElement? .href;
4767
+ assert (canonicalLibrary != null );
4768
+ assert (canonicalLibrary == library);
4769
+ return '${enclosingElement .library .dirName }/${enclosingElement .name }/$name ' ;
4735
4770
}
4736
4771
4737
4772
@override
0 commit comments