blob: 6b8d9905e6838201d9b1683d0665b48f08a48257 [file] [log] [blame]
// 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/src/dart/element/member.dart' show ParameterMember;
import 'package:dartdoc/src/element_type.dart';
import 'package:dartdoc/src/model/comment_referable.dart';
import 'package:dartdoc/src/model/model.dart';
class Parameter extends ModelElement implements EnclosedElement {
Parameter(
ParameterElement element, Library library, PackageGraph packageGraph,
{ParameterMember originalMember})
: super(element, library, packageGraph, originalMember);
String get defaultValue {
if (!hasDefaultValue) return null;
return element.defaultValueCode;
}
@override
ModelElement get enclosingElement => (element.enclosingElement != null)
? modelBuilder.from(element.enclosingElement, library)
: null;
bool get hasDefaultValue {
return element.defaultValueCode != null &&
element.defaultValueCode.isNotEmpty;
}
@override
String get filePath {
throw UnimplementedError('Parameters have no generated files in dartdoc');
}
@override
String get href => null;
@override
String get htmlId {
if (element.enclosingElement != null) {
var enclosingName = element.enclosingElement.name;
if (element.enclosingElement is GenericFunctionTypeElement) {
// TODO(jcollins-g): Drop when GenericFunctionTypeElement populates name.
// Also, allowing null here is allowed as a workaround for
// dart-lang/sdk#32005.
for (var e = element.enclosingElement;
e.enclosingElement != null;
e = e.enclosingElement) {
enclosingName = e.name;
if (enclosingName != null && enclosingName.isNotEmpty) break;
}
}
return '$enclosingName-param-$name';
} else {
return 'param-$name';
}
}
@override
int get hashCode => element == null ? 0 : element.hashCode;
@override
bool operator ==(Object object) =>
object is Parameter && (element.type == object.element.type);
bool get isCovariant => element.isCovariant;
bool get isRequiredPositional => element.isRequiredPositional;
bool get isNamed => element.isNamed;
bool get isOptionalPositional => element.isOptionalPositional;
/// Only true if this is a required named parameter.
bool get isRequiredNamed => element.isRequiredNamed;
@override
String get kind => 'parameter';
Map<String, CommentReferable> _referenceChildren;
@override
Map<String, CommentReferable> get referenceChildren {
if (_referenceChildren == null) {
_referenceChildren = {};
var _modelType = modelType;
if (_modelType is Callable) {
_referenceChildren.addEntriesIfAbsent(
_modelType.parameters.explicitOnCollisionWith(this));
}
_referenceChildren.addEntriesIfAbsent(
modelType.typeArguments.explicitOnCollisionWith(this));
if (_modelType is Callable) {
_referenceChildren.addEntriesIfAbsent(
_modelType.returnType.typeArguments.explicitOnCollisionWith(this));
}
}
return _referenceChildren;
}
@override
Iterable<CommentReferable> get referenceParents => [enclosingElement];
@override
ParameterElement get element => super.element;
@override
ParameterMember get originalMember => super.originalMember;
ElementType _modelType;
ElementType get modelType => _modelType ??=
modelBuilder.typeFrom((originalMember ?? element).type, library);
}