forked from dart-lang/dartdoc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmethod.dart
147 lines (122 loc) · 4.49 KB
/
method.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/source/line_info.dart';
// ignore: implementation_imports
import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember;
import 'package:dartdoc/src/element_type.dart';
import 'package:dartdoc/src/model/attribute.dart';
import 'package:dartdoc/src/model/comment_referable.dart';
import 'package:dartdoc/src/model/model.dart';
class Method extends ModelElement
with ContainerMember, Inheritable, TypeParameters {
@override
final MethodElement element;
Container? _enclosingContainer;
final bool _isInherited;
@override
late final List<TypeParameter> typeParameters;
Method(this.element, super.library, super.packageGraph)
: _isInherited = false {
_calcTypeParameters();
}
Method.inherited(this.element, this._enclosingContainer, Library library,
PackageGraph packageGraph,
{ExecutableMember? originalMember})
: _isInherited = true,
super(library, packageGraph, originalMember) {
_calcTypeParameters();
}
void _calcTypeParameters() {
typeParameters = element.typeParameters.map((f) {
return getModelFor(f, library) as TypeParameter;
}).toList(growable: false);
}
@override
CharacterLocation? get characterLocation {
if (enclosingElement is Enum && name == 'toString') {
// The toString() method on Enums is special, treated as not having
// a definition location by the analyzer yet not being inherited, either.
// Just directly override our location with the Enum definition --
// this is OK because Enums can not inherit from each other nor
// have their definitions split between files.
return enclosingElement.characterLocation;
}
return super.characterLocation;
}
@override
Container get enclosingElement => _enclosingContainer ??=
getModelFor(element.enclosingElement, library) as Container;
@override
String get filePath =>
'${enclosingElement.library.dirName}/${enclosingElement.name}/$fileName';
@override
String get aboveSidebarPath => enclosingElement.sidebarPath;
@override
String? get belowSidebarPath => null;
String get fullkind {
// A method cannot be abstract and static at the same time.
if (element.isAbstract) return 'abstract $kind';
if (element.isStatic) return 'static $kind';
return kind.toString();
}
@override
String? get href {
assert(!identical(canonicalModelElement, this) ||
canonicalEnclosingContainer == enclosingElement);
return super.href;
}
@override
bool get isInherited => _isInherited;
bool get isOperator => false;
@override
Set<Attribute> get attributes => {
...super.attributes,
if (isInherited) Attribute.inherited,
};
bool get isStatic => element.isStatic;
@override
Kind get kind => Kind.method;
@override
ExecutableMember? get originalMember =>
super.originalMember as ExecutableMember?;
late final Callable modelType =
getTypeFor((originalMember ?? element).type, library) as Callable;
@override
Method? get overriddenElement {
if (_enclosingContainer is Extension) {
return null;
}
var parent = element.enclosingElement as InterfaceElement;
for (var t in parent.augmented.declaration.allSupertypes) {
Element? e = t.getMethod(element.name);
if (e != null) {
assert(
e.enclosingElement is InterfaceElement,
'Expected "${e.enclosingElement?.name}" to be a InterfaceElement, '
'but was ${e.enclosingElement.runtimeType}',
);
return getModelForElement(e) as Method?;
}
}
return null;
}
/// Methods can not be covariant; always returns false.
@override
bool get isCovariant => false;
Map<String, CommentReferable>? _referenceChildren;
@override
Map<String, CommentReferable> get referenceChildren {
var from = documentationFrom.first as Method;
if (!identical(this, from)) {
return from.referenceChildren;
}
return _referenceChildren ??= <String, CommentReferable>{
...modelType.returnType.typeArguments.explicitOnCollisionWith(this),
...modelType.typeArguments.explicitOnCollisionWith(this),
...parameters.explicitOnCollisionWith(this),
...typeParameters.explicitOnCollisionWith(this),
};
}
}