Skip to content
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
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
## 3.0.0

### Breaking Changes

* require Dart 3.9+
* support analyzer 10.x only
* migrate generator internals to the analyzer 10 element API

## [2.0.1](https://github.com/Stacked-Org/generator/compare/v2.0.0...v2.0.1) (2026-03-07)


Expand Down
13 changes: 7 additions & 6 deletions lib/import_resolver.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:path/path.dart' as p;
import 'package:stacked_generator/utils.dart';

class ImportResolver {
final List<LibraryElement2> libs;
final List<LibraryElement> libs;
final String targetFilePath;

const ImportResolver(this.libs, this.targetFilePath);

String? resolve(Element2? element) {
String? resolve(Element? element) {
// return early if source is null or element is a core type
final elementSourceUri = _sourceUriOfElement(element);
if (elementSourceUri == null || _isCoreDartType(element)) {
Expand Down Expand Up @@ -44,12 +45,12 @@ class ImportResolver {
}

Uri? _sourceUriOfElement(Element? element) {
return element?.firstFragment.libraryFragment?.source.uri;
return elementSourceUri(element);
}

Set<String> resolveAll(DartType type) {
final imports = <String>{};
final resolvedValue = resolve(type.element3);
final resolvedValue = resolve(type.element);
if (resolvedValue != null) {
imports.add(resolvedValue);
}
Expand All @@ -61,7 +62,7 @@ class ImportResolver {
final imports = <String>{};
if (typeToCheck is ParameterizedType) {
for (DartType type in typeToCheck.typeArguments) {
final resolvedValue = resolve(type.element3);
final resolvedValue = resolve(type.element);
if (resolvedValue != null) {
imports.add(resolvedValue);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:analyzer/dart/constant/value.dart';
import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:source_gen/source_gen.dart';
import 'package:stacked_generator/import_resolver.dart';
import 'package:stacked_generator/src/generators/bottomsheets/bottomsheet_config.dart';
Expand All @@ -21,7 +21,7 @@ class BottomsheetConfigResolver {
final bottomsheetClassType =
bottomsheetReader.read('classType').typeValue;

final classElement = bottomsheetClassType.element3 as ClassElement2?;
final classElement = bottomsheetClassType.element as ClassElement?;

// Get the import of the class type that's defined for the bottomSheet
final import = importResolver.resolve(classElement!);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
import 'dart:async';

import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:build/build.dart';
import 'package:source_gen/source_gen.dart';
import 'package:stacked_generator/import_resolver.dart';
import 'package:stacked_generator/src/generators/bottomsheets/generate/bottomsheet_class_generator.dart';
import 'package:stacked_generator/utils.dart';
import 'package:stacked_shared/stacked_shared.dart';

import 'bottomsheet_config_resolver.dart';

class StackedBottomsheetGenerator extends GeneratorForAnnotation<StackedApp> {
@override
FutureOr<String> generateForAnnotatedElement(
Element2 element,
Element element,
ConstantReader annotation,
BuildStep buildStep,
) async {
final bottomsheetResolver = BottomsheetConfigResolver();
final libs = await buildStep.resolver.libraries.toList();
final importResolver = ImportResolver(
libs,
element.firstFragment.libraryFragment?.source.uri.path ?? '',
elementSourceUri(element)?.path ?? '',
);

/// If the bottomsheets parameter is not mentioned in the StackedApp
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:analyzer/dart/constant/value.dart';
import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:source_gen/source_gen.dart';
import 'package:stacked_generator/import_resolver.dart';
import 'package:stacked_generator/src/generators/dialogs/dialog_config.dart';
Expand All @@ -21,7 +21,7 @@ class DialogConfigResolver {
// Get the type of the dialog that we want to register
final dialogClassType = dialogReader.read('classType').typeValue;

final classElement = dialogClassType.element3 as ClassElement2?;
final classElement = dialogClassType.element as ClassElement?;

// Get the import of the class type that's defined for the dialog
final import = importResolver.resolve(classElement!);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
import 'dart:async';

import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:build/build.dart';
import 'package:source_gen/source_gen.dart';
import 'package:stacked_generator/import_resolver.dart';
import 'package:stacked_generator/src/generators/dialogs/generate/dialog_class_generator.dart';
import 'package:stacked_generator/utils.dart';
import 'package:stacked_shared/stacked_shared.dart';

import 'dialog_config_resolver.dart';

class StackedDialogGenerator extends GeneratorForAnnotation<StackedApp> {
@override
FutureOr<String> generateForAnnotatedElement(
Element2 element,
Element element,
ConstantReader annotation,
BuildStep buildStep,
) async {
final dialogResolver = DialogConfigResolver();
final libs = await buildStep.resolver.libraries.toList();
final importResolver = ImportResolver(
libs,
element.firstFragment.libraryFragment?.source.uri.path ?? '',
elementSourceUri(element)?.path ?? '',
);

/// If the dialogs parameter is not mentioned in the StackedApp
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/element.dart';

class InvalidGeneratorInputException implements Exception {
final String message;
final String? todo;
final Element2? element;
final Element? element;
const InvalidGeneratorInputException(this.message, {this.todo, this.element});

@override
Expand Down
2 changes: 1 addition & 1 deletion lib/src/generators/forms/field_config.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// ignore_for_file: unnecessary_this

import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/element.dart';

/// Described a single field to be generated.
///
Expand Down
15 changes: 8 additions & 7 deletions lib/src/generators/forms/stacked_form_generator.dart
Original file line number Diff line number Diff line change
@@ -1,27 +1,28 @@
import 'dart:async';

import 'package:analyzer/dart/constant/value.dart';
import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:build/build.dart';
import 'package:source_gen/source_gen.dart';
import 'package:stacked_generator/import_resolver.dart';
import 'package:stacked_generator/src/generators/forms/field_config.dart';
import 'package:stacked_generator/src/generators/forms/form_view_config.dart';
import 'package:stacked_generator/src/generators/forms/stacked_form_content_generator.dart';
import 'package:stacked_generator/utils.dart';
import 'package:stacked_shared/stacked_shared.dart';

class StackedFormGenerator extends GeneratorForAnnotation<FormView> {
@override
FutureOr<String> generateForAnnotatedElement(
// ignore: avoid_renaming_method_parameters
Element2 classForAnnotation,
Element classForAnnotation,
// ignore: avoid_renaming_method_parameters
ConstantReader formView,
BuildStep buildStep,
) async {
var libs = await buildStep.resolver.libraries.toList();
var importResolver =
ImportResolver(libs, classForAnnotation.firstFragment.libraryFragment?.source.uri.path ?? '');
ImportResolver(libs, elementSourceUri(classForAnnotation)?.path ?? '');

final viewName = classForAnnotation.displayName;

Expand Down Expand Up @@ -88,11 +89,11 @@ FieldConfig _readTextFieldConfig({
}) {
final String name = (fieldReader.peek('name')?.stringValue) ?? '';
final String? initialValue = (fieldReader.peek('initialValue')?.stringValue);
final ExecutableElement2? validatorFunction =
(fieldReader.peek('validator')?.objectValue)?.toFunctionValue2();
final ExecutableElement2? customTextEditingController =
final ExecutableElement? validatorFunction =
(fieldReader.peek('validator')?.objectValue)?.toFunctionValue();
final ExecutableElement? customTextEditingController =
(fieldReader.peek('customTextEditingController')?.objectValue)
?.toFunctionValue2();
?.toFunctionValue();
return TextFieldConfig(
name: name,
initialValue: initialValue,
Expand Down
15 changes: 8 additions & 7 deletions lib/src/generators/getit/dependency_config_factory.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:analyzer/dart/constant/value.dart';
import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:source_gen/source_gen.dart';
import 'package:stacked_generator/import_resolver.dart';
Expand Down Expand Up @@ -41,7 +41,7 @@ class DependencyConfigFactory {
final DartType? dependencyAbstractedClassType =
dependencyReader.peek('asType')?.typeValue;

final classElement = dependencyClassType.element3 as ClassElement2?;
final classElement = dependencyClassType.element as ClassElement?;

throwIf(
classElement == null,
Expand All @@ -60,7 +60,7 @@ class DependencyConfigFactory {
final import = importResolver.resolve(classElement!);

final abstractedClassElement =
dependencyAbstractedClassType?.element3 as ClassElement2?;
dependencyAbstractedClassType?.element as ClassElement?;

final abstractedImport = importResolver.resolve(abstractedClassElement);

Expand All @@ -71,7 +71,7 @@ class DependencyConfigFactory {
: null;

// NOTE: This can be used for actual dependency inject. We do service location instead.
final constructor = classElement.unnamedConstructor2;
final constructor = classElement.unnamedConstructor;

if (dependencyReader.instanceOf(const TypeChecker.typeNamed(
Factory,
Expand All @@ -91,7 +91,7 @@ class DependencyConfigFactory {
))) {
final ConstantReader? resolveUsing =
dependencyReader.peek('resolveUsing');
final resolveObject = resolveUsing?.objectValue.toFunctionValue2();
final resolveObject = resolveUsing?.objectValue.toFunctionValue();

return SingletonDependency(
instanceName: instanceName,
Expand All @@ -107,7 +107,7 @@ class DependencyConfigFactory {
))) {
final ConstantReader? resolveUsing =
dependencyReader.peek('resolveUsing');
final resolveObject = resolveUsing?.objectValue.toFunctionValue2();
final resolveObject = resolveUsing?.objectValue.toFunctionValue();

return LazySingletonDependency(
instanceName: instanceName,
Expand All @@ -118,12 +118,13 @@ class DependencyConfigFactory {
environments: environments,
resolveFunction: resolveObject?.displayName);
} else if (dependencyReader.instanceOf(const TypeChecker.typeNamed(
// ignore: deprecated_member_use
Presolve,
inPackage: 'stacked_shared',
))) {
final ConstantReader? presolveUsing =
dependencyReader.peek('presolveUsing');
final presolveObject = presolveUsing?.objectValue.toFunctionValue2();
final presolveObject = presolveUsing?.objectValue.toFunctionValue();
return PresolveSingletonDependency(
instanceName: instanceName,
import: import!,
Expand Down
6 changes: 3 additions & 3 deletions lib/src/generators/getit/stacked_locator_generator.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'dart:async';

import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:build/build.dart';
import 'package:source_gen/source_gen.dart';
import 'package:stacked_generator/import_resolver.dart';
Expand All @@ -15,15 +15,15 @@ import 'dependency_config_factory.dart';
class StackedLocatorGenerator extends GeneratorForAnnotation<StackedApp> {
@override
FutureOr<String> generateForAnnotatedElement(
Element2 element,
Element element,
// ignore: avoid_renaming_method_parameters
ConstantReader stackedApplication,
BuildStep buildStep,
) async {
final libs = await buildStep.resolver.libraries.toList();
final importResolver = ImportResolver(
libs,
element.firstFragment.libraryFragment?.source.uri.path ?? '',
elementSourceUri(element)?.path ?? '',
);

final String locatorName =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:source_gen/source_gen.dart';
import 'package:stacked_generator/import_resolver.dart';
import 'package:stacked_generator/utils.dart';
Expand Down
6 changes: 3 additions & 3 deletions lib/src/generators/logging/logger_config_resolver.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:analyzer/dart/constant/value.dart';
import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:source_gen/source_gen.dart';
import 'package:stacked_generator/import_resolver.dart';
import 'package:stacked_generator/src/generators/logging/logger_config.dart';
Expand Down Expand Up @@ -58,8 +58,8 @@ class LoggerConfigResolver {
}
}

ClassElement2 _dartOjectToElemet(DartObject obj) {
ClassElement _dartOjectToElemet(DartObject obj) {
var dependencyReader = ConstantReader(obj).typeValue;
return dependencyReader.element3 as ClassElement2;
return dependencyReader.element as ClassElement;
}
}
7 changes: 4 additions & 3 deletions lib/src/generators/logging/stacked_logger_generator.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import 'dart:async';

import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:build/build.dart';
import 'package:source_gen/source_gen.dart';
import 'package:stacked_generator/import_resolver.dart';
import 'package:stacked_generator/utils.dart';
import 'package:stacked_shared/stacked_shared.dart';

import 'logger_class_generator.dart';
Expand All @@ -12,15 +13,15 @@ import 'logger_config_resolver.dart';
class StackedLoggerGenerator extends GeneratorForAnnotation<StackedApp> {
@override
FutureOr<String> generateForAnnotatedElement(
Element2 element,
Element element,
ConstantReader annotation,
BuildStep buildStep,
) async {
var loggerResolver = LoggerConfigResolver();
var libs = await buildStep.resolver.libraries.toList();
var importResolver = ImportResolver(
libs,
element.firstFragment.libraryFragment?.source.uri.path ?? '',
elementSourceUri(element)?.path ?? '',
);

final loggerConfig = await loggerResolver.resolve(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:source_gen/source_gen.dart';
import 'package:stacked_generator/src/generators/router_common/models/importable_type.dart';
import 'package:stacked_generator/src/generators/router_common/models/route_config.dart';
import 'package:stacked_generator/utils.dart';
import 'package:stacked_shared/stacked_shared.dart';

import '../../router_common/models/route_parameter_config.dart';
Expand Down Expand Up @@ -80,7 +81,7 @@ class RouteConfigFactory {
final function = stackedRoute
.peek('transitionsBuilder')
?.objectValue
.toFunctionValue2();
.toFunctionValue();

ResolvedType? customTransitionBuilder;
if (function != null) {
Expand All @@ -92,7 +93,7 @@ class RouteConfigFactory {

customTransitionBuilder = ResolvedType(
name: functionName,
import: function.firstFragment.libraryFragment.source.uri.toString(),
import: elementSourceUri(function)?.toString(),
);
}

Expand Down
Loading