mirror of
https://github.com/pese-git/cherrypick.git
synced 2026-03-25 04:40:33 +00:00
- Fully migrated core cherrypick_generator and submodules to new analyzer element2 system: - Updated all GeneratorForAnnotation overrides to use Element2, ClassElement2, MethodElement2, FieldElement2 and new annotation/metadata access patterns. - Migrated signature and bodies for helpers, parsers, annotation validators, meta utils, and type parsers. - Fixed tests to use readerWriter instead of deprecated reader argument. - Refactored usage of now-absent 'metadata', 'parameters', 'fields', 'methods', 'source', and similar members to use correct *.firstFragment.* or API alternatives. - Cleaned up old imports and unused code. test(generator): update generator integration tests - Updated test calls to use correct TestReaderWriter type and bring test infra in line with current build_runner/testing API. build: update dependencies and pubspec to support latest analyzer/build ecosystem - Raised Dart SDK and package constraints as required for generated code and codegen plugins. - Updated pubspecs in root/examples as needed by build warnings. docs: add plots and assets (new files) BREAKING CHANGE: - Requires Dart 3.8+ and analyzer that supports element2. - All downstream codegen/tests depending on Element API must migrate to Element2 signatures and data model.
79 lines
2.7 KiB
Dart
79 lines
2.7 KiB
Dart
//
|
|
// Copyright 2021 Sergey Penkovsky (sergey.penkovsky@gmail.com)
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
// https://www.apache.org/licenses/LICENSE-2.0
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
|
|
import 'package:analyzer/dart/element/element.dart';
|
|
|
|
/// ---------------------------------------------------------------------------
|
|
/// MetadataUtils
|
|
///
|
|
/// Static utilities for querying and extracting information from
|
|
/// Dart annotations ([ElementAnnotation]) in the context of code generation,
|
|
/// such as checking for the presence of specific DI-related annotations.
|
|
/// Designed to be used internally by code generation and validation routines.
|
|
///
|
|
/// # Example usage
|
|
/// ```dart
|
|
/// if (MetadataUtils.anyMeta(method.metadata, 'singleton')) {
|
|
/// // The method is annotated with @singleton
|
|
/// }
|
|
/// final name = MetadataUtils.getNamedValue(field.metadata);
|
|
/// if (name != null) print('@named value: $name');
|
|
/// ```
|
|
/// ---------------------------------------------------------------------------
|
|
class MetadataUtils {
|
|
/// Checks whether any annotation in [meta] matches the [typeName]
|
|
/// (type name is compared in a case-insensitive manner and can be partial).
|
|
///
|
|
/// Returns true if an annotation (such as @singleton, @provide, @named) is found.
|
|
///
|
|
/// Example:
|
|
/// ```dart
|
|
/// bool isSingleton = MetadataUtils.anyMeta(myMethod.metadata, 'singleton');
|
|
/// ```
|
|
static bool anyMeta(List<ElementAnnotation> meta, String typeName) {
|
|
return meta.any(
|
|
(m) =>
|
|
m
|
|
.computeConstantValue()
|
|
?.type
|
|
?.getDisplayString()
|
|
.toLowerCase()
|
|
.contains(typeName.toLowerCase()) ??
|
|
false,
|
|
);
|
|
}
|
|
|
|
/// Extracts the string value from a `@named('value')` annotation if present in [meta].
|
|
///
|
|
/// Returns the named value or `null` if not annotated.
|
|
///
|
|
/// Example:
|
|
/// ```dart
|
|
/// // For: @named('dev') ApiClient provideApi() ...
|
|
/// final named = MetadataUtils.getNamedValue(method.metadata); // 'dev'
|
|
/// ```
|
|
static String? getNamedValue(List<ElementAnnotation> meta) {
|
|
for (final m in meta) {
|
|
final cv = m.computeConstantValue();
|
|
|
|
final typeStr = cv?.type?.getDisplayString().toLowerCase();
|
|
|
|
if (typeStr?.contains('named') ?? false) {
|
|
return cv?.getField('value')?.toStringValue();
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|