Skip to content

Commit 41f0262

Browse files
authored
Greatly simplify ModelCommentReference (#3541)
1 parent 50e4b67 commit 41f0262

File tree

4 files changed

+13
-93
lines changed

4 files changed

+13
-93
lines changed

lib/src/comment_references/model_comment_reference.dart

Lines changed: 4 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -4,82 +4,26 @@
44
//
55

66
import 'package:analyzer/dart/ast/ast.dart';
7-
import 'package:analyzer/dart/element/element.dart';
8-
import 'package:analyzer/file_system/file_system.dart';
97
import 'package:dartdoc/src/comment_references/parser.dart';
108

11-
abstract class ModelCommentReference {
12-
String get codeRef;
13-
bool get hasCallableHint;
14-
List<String> get referenceBy;
15-
Element? get staticElement;
16-
17-
/// Construct a [ModelCommentReference] using the analyzer AST.
18-
factory ModelCommentReference(
19-
CommentReference ref, ResourceProvider resourceProvider) =>
20-
_ModelCommentReferenceImpl(ref, resourceProvider);
21-
22-
/// Construct a [ModelCommentReference] given a raw string.
23-
factory ModelCommentReference.synthetic(String codeRef) =>
24-
_ModelCommentReferenceImpl.synthetic(codeRef, null);
25-
}
26-
279
/// A stripped down analyzer AST [CommentReference] containing only that
28-
/// information needed for Dartdoc. Drops link to the [CommentReference]
29-
/// and [ResourceProvider] after construction.
30-
class _ModelCommentReferenceImpl implements ModelCommentReference {
31-
@override
10+
/// information needed for Dartdoc.
11+
class ModelCommentReference {
3212
final String codeRef;
3313

34-
@override
3514
bool get hasCallableHint =>
3615
parsed.isNotEmpty &&
3716
((parsed.length > 1 && parsed.last.text == 'new') ||
3817
parsed.last is CallableHintEndNode);
3918

40-
@override
4119
List<String> get referenceBy => parsed
4220
.whereType<IdentifierNode>()
4321
.map<String>((i) => i.text)
4422
.toList(growable: false);
4523

46-
@override
47-
final Element? staticElement;
48-
49-
_ModelCommentReferenceImpl(
50-
CommentReference ref, ResourceProvider resourceProvider)
51-
: codeRef = _referenceText(ref, resourceProvider),
52-
staticElement = ref.expression.element;
53-
54-
_ModelCommentReferenceImpl.synthetic(this.codeRef, this.staticElement);
55-
56-
/// "Unparse" the code reference into the raw text associated with the
57-
/// [CommentReference].
58-
static String _referenceText(
59-
CommentReference ref, ResourceProvider resourceProvider) {
60-
var token = (ref.parent as Comment)
61-
.tokens
62-
.firstWhere((t) => t.offset <= ref.offset && t.end >= ref.end);
63-
// This is a little sketchy, but works since comments happen to be a token
64-
// that is fully preserved in its string representation.
65-
// TODO(jcollins-g): replace unparsing in general with lower level changes.
66-
return token
67-
.toString()
68-
.substring(ref.offset - token.offset, ref.end - token.offset);
69-
}
24+
/// Constructs a [ModelCommentReference] given a raw string.
25+
ModelCommentReference(this.codeRef);
7026

7127
late final List<CommentReferenceNode> parsed =
7228
CommentReferenceParser(codeRef).parse();
7329
}
74-
75-
extension on CommentReferableExpression {
76-
Element? get element {
77-
var self = this;
78-
return switch (self) {
79-
PrefixedIdentifier() => self.staticElement,
80-
PropertyAccess() => self.propertyName.staticElement,
81-
SimpleIdentifier() => self.staticElement,
82-
_ => null
83-
};
84-
}
85-
}

lib/src/generator/templates.runtime_renderers.dart

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17009,14 +17009,7 @@ const _invisibleGetters = {
1700917009
'superclassConstraints'
1701017010
},
1701117011
'ModelElementRenderer': {'hashCode', 'runtimeType'},
17012-
'ModelNode': {
17013-
'commentRefs',
17014-
'element',
17015-
'hashCode',
17016-
'resourceProvider',
17017-
'runtimeType',
17018-
'sourceCode'
17019-
},
17012+
'ModelNode': {'hashCode', 'runtimeType', 'sourceCode'},
1702017013
'ModelObjectBuilder': {'hashCode', 'runtimeType'},
1702117014
'PackageGraph': {
1702217015
'allCanonicalModelElements',

lib/src/markdown_processor.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ bool _requireCallable(CommentReferable? referable) =>
162162

163163
MatchingLinkResult _getMatchingLinkElement(
164164
String referenceText, Warnable element) {
165-
var commentReference = ModelCommentReference.synthetic(referenceText);
165+
var commentReference = ModelCommentReference(referenceText);
166166

167167
// A filter to be used by [CommentReferable.referenceBy].
168168
bool Function(CommentReferable?) filter;

lib/src/model/model_node.dart

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,21 @@ import 'dart:convert';
77
import 'package:analyzer/dart/ast/ast.dart';
88
import 'package:analyzer/dart/element/element.dart';
99
import 'package:analyzer/file_system/file_system.dart';
10-
import 'package:dartdoc/src/comment_references/model_comment_reference.dart';
1110
import 'package:dartdoc/src/model_utils.dart' as model_utils;
1211
import 'package:meta/meta.dart';
1312

1413
/// Stripped down information derived from [AstNode] containing only information
15-
/// needed for Dartdoc. Drops link to the [AstNode] after construction.
14+
/// needed to resurrect the source code of [element].
1615
class ModelNode {
17-
final List<ModelCommentReference> commentRefs;
18-
final Element element;
19-
final ResourceProvider resourceProvider;
16+
final Element _element;
17+
final ResourceProvider _resourceProvider;
2018
final int _sourceEnd;
2119
final int _sourceOffset;
2220

2321
factory ModelNode(
2422
AstNode? sourceNode, Element element, ResourceProvider resourceProvider) {
25-
var commentRefs = _commentRefsFor(sourceNode, resourceProvider);
2623
if (sourceNode == null) {
27-
return ModelNode._(element, resourceProvider, commentRefs,
24+
return ModelNode._(element, resourceProvider,
2825
sourceEnd: -1, sourceOffset: -1);
2926
} else {
3027
// Get a node higher up the syntax tree that includes the semicolon.
@@ -35,38 +32,24 @@ class ModelNode {
3532
assert(sourceNode is FieldDeclaration ||
3633
sourceNode is TopLevelVariableDeclaration);
3734
}
38-
return ModelNode._(element, resourceProvider, commentRefs,
35+
return ModelNode._(element, resourceProvider,
3936
sourceEnd: sourceNode.end, sourceOffset: sourceNode.offset);
4037
}
4138
}
4239

43-
ModelNode._(this.element, this.resourceProvider, this.commentRefs,
40+
ModelNode._(this._element, this._resourceProvider,
4441
{required int sourceEnd, required int sourceOffset})
4542
: _sourceEnd = sourceEnd,
4643
_sourceOffset = sourceOffset;
4744

48-
static List<ModelCommentReference> _commentRefsFor(
49-
AstNode? node, ResourceProvider resourceProvider) {
50-
if (node is AnnotatedNode) {
51-
var nodeDocumentationComment = node.documentationComment;
52-
if (nodeDocumentationComment != null) {
53-
return [
54-
for (var m in nodeDocumentationComment.references)
55-
ModelCommentReference(m, resourceProvider),
56-
];
57-
}
58-
}
59-
return const [];
60-
}
61-
6245
bool get _isSynthetic => _sourceEnd < 0 || _sourceOffset < 0;
6346

6447
/// The text of the source code of this node, stripped of the leading
6548
/// indentation, and stripped of the doc comments.
6649
late final String sourceCode = _isSynthetic
6750
? ''
6851
: model_utils
69-
.getFileContentsFor(element, resourceProvider)
52+
.getFileContentsFor(_element, _resourceProvider)
7053
.substringFromLineStart(_sourceOffset, _sourceEnd)
7154
.stripIndent
7255
.stripDocComments

0 commit comments

Comments
 (0)