Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate TopLevelVariable and GetterSetterCombo element model #3985

Merged
merged 1 commit into from
Feb 3, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 38 additions & 2 deletions lib/src/generator/templates.runtime_renderers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14411,7 +14411,7 @@ class _Renderer_LibraryContainer extends RendererBase<LibraryContainer> {
}
}

String renderLibraryRedirect(LibraryTemplateData context, Template template) {
String renderLibrary(LibraryTemplateData context, Template template) {
var buffer = StringBuffer();
_render_LibraryTemplateData(context, template.ast, template, buffer);
return buffer.toString();
Expand Down Expand Up @@ -14657,7 +14657,7 @@ class _Renderer_LibraryTemplateData extends RendererBase<LibraryTemplateData> {
}
}

String renderLibrary(LibraryTemplateData context, Template template) {
String renderLibraryRedirect(LibraryTemplateData context, Template template) {
var buffer = StringBuffer();
_render_LibraryTemplateData(context, template.ast, template, buffer);
return buffer.toString();
Expand Down Expand Up @@ -24179,6 +24179,34 @@ class _Renderer_TopLevelVariable extends RendererBase<TopLevelVariable> {
);
},
),
'element2': Property(
getValue: (CT_ c) => c.element2,
renderVariable:
(CT_ c, Property<CT_> self, List<String> remainingNames) =>
self.renderSimpleVariable(
c,
remainingNames,
'TopLevelVariableElement2',
),

isNullValue: (CT_ c) => false,

renderValue: (
CT_ c,
RendererBase<CT_> r,
List<MustachioNode> ast,
StringSink sink,
) {
renderSimple(
c.element2,
ast,
r.template,
sink,
parent: r,
getters: _invisibleGetters['TopLevelVariableElement2']!,
);
},
),
'enclosingElement': Property(
getValue: (CT_ c) => c.enclosingElement,
renderVariable: (
Expand Down Expand Up @@ -27053,6 +27081,14 @@ const _invisibleGetters = {
'isExternal',
'runtimeType',
},
'TopLevelVariableElement2': {
'baseElement',
'firstFragment',
'fragments',
'hashCode',
'isExternal',
'runtimeType',
},
'TypeAliasElement': {
'aliasedElement',
'aliasedType',
Expand Down
33 changes: 19 additions & 14 deletions lib/src/model/getter_setter_combo.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,26 @@
// 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.

// ignore_for_file: analyzer_use_new_elements

import 'dart:convert';

import 'package:analyzer/dart/ast/ast.dart'
show Expression, InstanceCreationExpression;
import 'package:analyzer/dart/element/element2.dart' show Annotatable;
import 'package:analyzer/source/line_info.dart';
// ignore: implementation_imports
import 'package:analyzer/src/dart/element/element.dart'
show ConstVariableElement;
import 'package:dartdoc/src/element_type.dart';
import 'package:dartdoc/src/model/accessor.dart';
import 'package:dartdoc/src/model/annotation.dart';
import 'package:dartdoc/src/model/attribute.dart';
import 'package:dartdoc/src/model/class.dart';
import 'package:dartdoc/src/model/comment_referable.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/model/constructor.dart';
import 'package:dartdoc/src/model/documentation_comment.dart';
import 'package:dartdoc/src/model/enum.dart';
import 'package:dartdoc/src/model/model_element.dart';
import 'package:dartdoc/src/model/parameter.dart';
import 'package:dartdoc/src/utils.dart';
import 'package:meta/meta.dart';

Expand Down Expand Up @@ -73,16 +78,16 @@ mixin GetterSetterCombo on ModelElement {
bool get hasConstantValueForDisplay => false;

late final Expression? _constantInitializer =
(element as ConstVariableElement).constantInitializer;
(element2.firstFragment as ConstVariableElement).constantInitializer;

String linkifyConstantValue(String original) {
if (_constantInitializer is! InstanceCreationExpression) return original;

var constructorName = _constantInitializer.constructorName.toString();
var staticElement = _constantInitializer.constructorName.staticElement;
if (staticElement == null) return original;
var element = _constantInitializer.constructorName.element;
if (element == null) return original;

var target = getModelForElement(staticElement) as Constructor;
var target = getModelForElement2(element) as Constructor;
var enclosingElement = target.enclosingElement;
if (enclosingElement is! Class) return original;

Expand All @@ -108,10 +113,10 @@ mixin GetterSetterCombo on ModelElement {
// explicit setters/getters will be handled by those objects, but
// if a warning comes up for an enclosing synthetic field we have to
// put it somewhere. So pick an accessor.
if (element.isSynthetic) {
if (element2.isSynthetic) {
if (hasExplicitGetter) return getter!.characterLocation;
if (hasExplicitSetter) return setter!.characterLocation;
assert(false, 'Field and accessors can not all be synthetic: $element');
assert(false, 'Field and accessors can not all be synthetic: $element2');
}
return super.characterLocation;
}
Expand All @@ -137,9 +142,9 @@ mixin GetterSetterCombo on ModelElement {

initializerString = 'const $initializerString';

var isImplicitConstructorCall = _constantInitializer
.constructorName.staticElement?.isDefaultConstructor ??
false;
var isImplicitConstructorCall =
_constantInitializer.constructorName.element?.isDefaultConstructor ??
false;
if (isImplicitConstructorCall) {
// For an enum value with an implicit constructor call (like
// `enum E { one, two; }`), `constantInitializer.toString()` does not
Expand Down Expand Up @@ -206,13 +211,13 @@ mixin GetterSetterCombo on ModelElement {
@override
late final String documentationComment =
_getterSetterDocumentationComment.isEmpty
? element.documentationComment ?? ''
? (element2 as Annotatable).documentationComment ?? ''
: _getterSetterDocumentationComment;

@override
bool get hasDocumentationComment =>
_getterSetterDocumentationComment.isNotEmpty ||
element.documentationComment != null;
(element2 as Annotatable).documentationComment != null;

/// Derives a documentation comment for the combo by copying documentation
/// from the [getter] and/or [setter].
Expand Down
2 changes: 1 addition & 1 deletion lib/src/model/model_element.dart
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ abstract class ModelElement
if (e is TopLevelVariableElement) {
assert(getter != null || setter != null);
newModelElement =
TopLevelVariable(e, library, packageGraph, getter, setter);
TopLevelVariable(e.asElement2, library, packageGraph, getter, setter);
} else if (e is FieldElement) {
if (enclosingContainer is Extension) {
newModelElement = Field(e, library, packageGraph,
Expand Down
23 changes: 15 additions & 8 deletions lib/src/model/top_level_variable.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
// 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.

// ignore_for_file: analyzer_use_new_elements

import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/element2.dart';
// ignore: implementation_imports
import 'package:analyzer/src/dart/element/element.dart';
import 'package:dartdoc/src/model/attribute.dart';
import 'package:dartdoc/src/model/comment_referable.dart';
import 'package:dartdoc/src/model/kind.dart';
Expand All @@ -14,15 +15,21 @@ import 'package:dartdoc/src/model/model.dart';
class TopLevelVariable extends ModelElement
with GetterSetterCombo, Categorization {
@override
final TopLevelVariableElement element;
// ignore: analyzer_use_new_elements
TopLevelVariableElement get element =>
// ignore: analyzer_use_new_elements
(element2.firstFragment as TopLevelVariableElementImpl).declaration;

@override
final TopLevelVariableElement2 element2;

@override
final Accessor? getter;
@override
final Accessor? setter;

TopLevelVariable(this.element, super.library, super.packageGraph, this.getter,
this.setter) {
TopLevelVariable(this.element2, super.library, super.packageGraph,
this.getter, this.setter) {
getter?.enclosingCombo = this;
setter?.enclosingCombo = this;
}
Expand Down Expand Up @@ -59,18 +66,18 @@ class TopLevelVariable extends ModelElement
}

@override
bool get isConst => element.isConst;
bool get isConst => element2.isConst;

@override
bool get isFinal {
/// isFinal returns true for the variable even if it has an explicit getter
/// (which means we should not document it as "final").
if (hasExplicitGetter) return false;
return element.isFinal;
return element2.isFinal;
}

@override
bool get isLate => isFinal && element.isLate;
bool get isLate => isFinal && element2.isLate;

// For use in templates.
bool get isProvidedByExtension => false;
Expand Down