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 to use new analyzer element model. #1340

Merged
merged 3 commits into from
Jan 31, 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
4 changes: 4 additions & 0 deletions built_value_generator/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
include: package:pedantic/analysis_options.yaml

linter:
rules:
- analyzer_use_new_elements
14 changes: 7 additions & 7 deletions built_value_generator/lib/built_value_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// 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/dart/element/element2.dart';
import 'package:build/build.dart';
import 'package:built_value_generator/src/enum_source_library.dart';
import 'package:built_value_generator/src/parsed_library_results.dart';
Expand All @@ -22,12 +22,12 @@ class BuiltValueGenerator extends Generator {
var parsedLibraryResults = ParsedLibraryResults();

// Workaround for https://github.com/google/built_value.dart/issues/941.
LibraryElement libraryElement;
LibraryElement2 libraryElement;
var attempts = 0;
while (true) {
try {
libraryElement = await buildStep.resolver.libraryFor(
await buildStep.resolver.assetIdForElement(library.element));
libraryElement = await buildStep.resolver.libraryFor2(
await buildStep.resolver.assetIdForElement2(library.element2));
parsedLibraryResults.parsedLibraryResultOrThrowingMock(libraryElement);
break;
} catch (_) {
Expand All @@ -54,19 +54,19 @@ class BuiltValueGenerator extends Generator {
result.writeln(_error(e.message));
log.severe(
'Error in BuiltValueGenerator for '
'${libraryElement.source.fullName}.',
'${libraryElement.firstFragment.source.fullName}.',
e,
st);
} catch (e, st) {
result.writeln(_error(e.toString()));
log.severe(
'Unknown error in BuiltValueGenerator for '
'${libraryElement.source.fullName}.',
'${libraryElement.firstFragment.source.fullName}.',
e,
st);
}

for (var element in libraryElement.units.expand((unit) => unit.classes)) {
for (var element in libraryElement.classes) {
if (ValueSourceClass.needsBuiltValue(element)) {
try {
result.writeln(
Expand Down
18 changes: 9 additions & 9 deletions built_value_generator/lib/src/dart_types.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// 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/dart/element/element2.dart';
import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:built_collection/built_collection.dart';
Expand All @@ -27,15 +27,15 @@ class DartTypes {
static bool isInstantiableBuiltValue(
ParsedLibraryResults parsedLibraryResults, DartType type) {
return isBuiltValue(type) &&
ValueSourceClass(parsedLibraryResults, type.element as ClassElement)
ValueSourceClass(parsedLibraryResults, type.element3 as ClassElement2)
.settings
.instantiable;
}

static bool isBuiltValue(DartType type) =>
type is InterfaceType &&
type.element.allSupertypes
.any((interfaceType) => interfaceType.element.name == 'Built');
type.element3.allSupertypes
.any((interfaceType) => interfaceType.element3.name3 == 'Built');

static bool isBuiltCollection(DartType type) {
return _builtCollectionNames
Expand Down Expand Up @@ -91,10 +91,10 @@ class DartTypes {
if (dartType.namedParameterTypes.isNotEmpty) {
if (parameters.isNotEmpty) parameters.write(', ');
parameters.write('{');
parameters.write(dartType.parameters
parameters.write(dartType.formalParameters
.where((p) => p.isOptionalNamed || p.isRequiredNamed)
.map((p) => '${p.isRequiredNamed ? 'required ' : ''}'
'${getName(p.type)} ${p.name}')
'${getName(p.type)} ${p.name3}')
.join(', '));
parameters.write('}');
}
Expand All @@ -103,15 +103,15 @@ class DartTypes {
} else if (dartType is InterfaceType) {
var typeArguments = dartType.typeArguments;
if (typeArguments.isEmpty) {
return dartType.element.name + suffix;
return dartType.element3.name3! + suffix;
} else {
final typeArgumentsStr = typeArguments
.map((type) => getName(type, withNullabilitySuffix: true))
.join(', ');
return '${dartType.element.name}<$typeArgumentsStr>$suffix';
return '${dartType.element3.name3}<$typeArgumentsStr>$suffix';
}
} else if (dartType is TypeParameterType) {
return dartType.element.name + suffix;
return dartType.element3.name3! + suffix;
} else if (dartType is RecordType) {
return dartType.getDisplayString();
} else if (dartType is VoidType) {
Expand Down
42 changes: 24 additions & 18 deletions built_value_generator/lib/src/enum_source_class.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
library built_value_generator.enum_source_class;

import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/element2.dart';
import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value_generator/src/dart_types.dart';
Expand All @@ -22,26 +22,26 @@ abstract class EnumSourceClass
implements Built<EnumSourceClass, EnumSourceClassBuilder> {
ParsedLibraryResults get parsedLibraryResults;

InterfaceElement get element;
InterfaceElement2 get element;

factory EnumSourceClass(ParsedLibraryResults parsedLibraryResults,
InterfaceElement element) =>
InterfaceElement2 element) =>
_$EnumSourceClass._(
parsedLibraryResults: parsedLibraryResults, element: element);
EnumSourceClass._();

@memoized
ParsedLibraryResult get parsedLibrary =>
parsedLibraryResults.parsedLibraryResultOrThrowingMock(element.library);
parsedLibraryResults.parsedLibraryResultOrThrowingMock(element.library2);

@memoized
String get name => element.name;
String get name => element.name3!;

/// Returns `mixin` if class modifiers are available, `abstract class`
/// otherwise.
///
/// The two are equivalent as class modifiers change the meaning of `class`.
String get _mixin => LibraryElements.areClassMixinsEnabled(element.library)
String get _mixin => LibraryElements.areClassMixinsEnabled(element.library2)
? 'mixin'
: 'abstract class';

Expand All @@ -50,7 +50,7 @@ abstract class EnumSourceClass

@memoized
BuiltValueEnum get settings {
var annotations = element.metadata
var annotations = element.metadata2.annotations
.map((annotation) => annotation.computeConstantValue())
.where(
(value) => DartTypes.tryGetName(value?.type) == 'BuiltValueEnum');
Expand All @@ -63,7 +63,7 @@ abstract class EnumSourceClass
@memoized
bool get isAbstract {
final element = this.element;
return element is ClassElement && element.isAbstract;
return element is ClassElement2 && element.isAbstract;
}

@memoized
Expand All @@ -72,16 +72,20 @@ abstract class EnumSourceClass

@memoized
BuiltList<String> get constructors =>
BuiltList<String>(element.constructors.map((element) {
final declaration = parsedLibrary.getElementDeclaration(element);
BuiltList<String>(element.constructors2.map((element) {
final declaration =
parsedLibrary.getElementDeclaration2(element.firstFragment);
return declaration?.node.toSource() ?? '';
}));

@memoized
String? get valuesIdentifier {
var getter = element.getGetter('values');
var getter = element.getGetter2('values');
if (getter == null) return null;
var source = parsedLibrary.getElementDeclaration(getter)!.node.toSource();
var source = parsedLibrary
.getElementDeclaration2(getter.firstFragment)!
.node
.toSource();
var matches = RegExp(r'static BuiltSet<' +
RegExp.escape(element.displayName) +
r'> get values => (_\$[\w$]+)\;')
Expand All @@ -91,9 +95,12 @@ abstract class EnumSourceClass

@memoized
String? get valueOfIdentifier {
var getter = element.getMethod('valueOf');
var getter = element.getMethod2('valueOf');
if (getter == null) return null;
var source = parsedLibrary.getElementDeclaration(getter)!.node.toSource();
var source = parsedLibrary
.getElementDeclaration2(getter.firstFragment)!
.node
.toSource();
var matches = RegExp(r'static ' +
RegExp.escape(element.displayName) +
r' valueOf\((?:final )?String name\) \=\> (\_\$[\w$]+)\(name\)\;')
Expand All @@ -103,9 +110,8 @@ abstract class EnumSourceClass

@memoized
bool get usesMixin =>
element.library.getClass(name + 'Mixin') != null ||
element.library.definingCompilationUnit.typeAliases
.any((a) => a.name == name + 'Mixin');
element.library2.getClass2(name + 'Mixin') != null ||
element.library2.typeAliases.any((a) => a.name3 == name + 'Mixin');

@memoized
Iterable<String> get identifiers {
Expand All @@ -116,7 +122,7 @@ abstract class EnumSourceClass
].nonNulls.toList();
}

static bool needsEnumClass(ClassElement classElement) {
static bool needsEnumClass(ClassElement2 classElement) {
// `Object` and mixins return `null` for `supertype`.
return DartTypes.tryGetName(classElement.supertype) == 'EnumClass';
}
Expand Down
8 changes: 4 additions & 4 deletions built_value_generator/lib/src/enum_source_class.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 9 additions & 9 deletions built_value_generator/lib/src/enum_source_field.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
library built_value_generator.enum_source_field;

import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/element2.dart';
import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';

Expand All @@ -16,22 +16,22 @@ part 'enum_source_field.g.dart';
abstract class EnumSourceField
implements Built<EnumSourceField, EnumSourceFieldBuilder> {
ParsedLibraryResult get parsedLibrary;
FieldElement get element;
FieldElement2 get element;

factory EnumSourceField(
ParsedLibraryResult parsedLibrary, FieldElement element) =>
ParsedLibraryResult parsedLibrary, FieldElement2 element) =>
_$EnumSourceField._(parsedLibrary: parsedLibrary, element: element);
EnumSourceField._();

@memoized
String get name => element.displayName;

@memoized
String? get type => DartTypes.tryGetName(element.getter?.returnType);
String? get type => DartTypes.tryGetName(element.getter2?.returnType);

@memoized
BuiltValueEnumConst get settings {
var annotations = element.metadata
var annotations = element.metadata2.annotations
.map((annotation) => annotation.computeConstantValue())
.where((value) =>
DartTypes.tryGetName(value?.type) == 'BuiltValueEnumConst');
Expand All @@ -48,7 +48,7 @@ abstract class EnumSourceField
String get generatedIdentifier {
var fieldName = element.displayName;
return parsedLibrary
.getElementDeclaration(element)!
.getElementDeclaration2(element.firstFragment)!
.node
.toSource()
.substring('$fieldName = '.length);
Expand All @@ -61,12 +61,12 @@ abstract class EnumSourceField
bool get isStatic => element.isStatic;

static BuiltList<EnumSourceField> fromClassElement(
ParsedLibraryResult parsedLibrary, InterfaceElement classElement) {
ParsedLibraryResult parsedLibrary, InterfaceElement2 classElement) {
var result = ListBuilder<EnumSourceField>();

var enumName = classElement.displayName;
for (var fieldElement in classElement.fields) {
final type = DartTypes.tryGetName(fieldElement.getter?.returnType);
for (var fieldElement in classElement.fields2) {
final type = DartTypes.tryGetName(fieldElement.getter2?.returnType);
if (!fieldElement.isSynthetic &&
(type == enumName || type == 'dynamic')) {
result.add(EnumSourceField(parsedLibrary, fieldElement));
Expand Down
8 changes: 4 additions & 4 deletions built_value_generator/lib/src/enum_source_field.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 10 additions & 10 deletions built_value_generator/lib/src/enum_source_library.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,10 @@
library built_value_generator.enum_source_library;

import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/element2.dart';
import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value_generator/src/enum_source_class.dart';
import 'package:built_value_generator/src/library_elements.dart';
import 'package:built_value_generator/src/parsed_library_results.dart';
import 'package:source_gen/source_gen.dart';

Expand All @@ -18,34 +17,35 @@ part 'enum_source_library.g.dart';
abstract class EnumSourceLibrary
implements Built<EnumSourceLibrary, EnumSourceLibraryBuilder> {
ParsedLibraryResults get parsedLibraryResults;
LibraryElement get element;
LibraryElement2 get element;

factory EnumSourceLibrary(
ParsedLibraryResults parsedLibraryResults, LibraryElement element) =>
ParsedLibraryResults parsedLibraryResults, LibraryElement2 element) =>
_$EnumSourceLibrary._(
parsedLibraryResults: parsedLibraryResults, element: element);
EnumSourceLibrary._();

@memoized
ParsedLibraryResult get parsedLibrary =>
parsedLibraryResults.parsedLibraryResultOrThrowingMock(element.library);
parsedLibraryResults.parsedLibraryResultOrThrowingMock(element.library2);

@memoized
String get name => element.name;
String get name => element.name3!;

@memoized
String get fileName => element.source.shortName.replaceAll('.dart', '');
String get fileName => element.firstFragment.source.shortName.replaceAll('.dart', '');

@memoized
String get source => element.source.contents.data;
String get source => element.firstFragment.source.contents.data;

@memoized
BuiltList<EnumSourceClass> get classes {
var result = ListBuilder<EnumSourceClass>();

for (var classElement in LibraryElements.getClassElements(element)) {
for (var classElement in element.classes) {
if (EnumSourceClass.needsEnumClass(classElement)) {
result.add(EnumSourceClass(parsedLibraryResults, classElement));
result
.add(EnumSourceClass(parsedLibraryResults, classElement));
}
}
return result.build();
Expand Down
Loading
Loading