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

feat: static_proxy. #59

Merged
merged 3 commits into from Sep 5, 2022
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 23 additions & 0 deletions example/lib/static_mapping/static_proxy.dart
@@ -0,0 +1,23 @@

import 'package:smartstruct/smartstruct.dart';

part 'static_proxy.mapper.g.dart';

class StaticProxyTarget {
final String text;
final num number;

StaticProxyTarget(this.text, this.number);
}

class StaticMappingSource {
final String text;
final num number;

StaticMappingSource(this.text, this.number);
}

@Mapper(generateStaticProxy: true)
abstract class StaticMappingMapper {
StaticProxyTarget fromSourceNormal(StaticMappingSource source);
}
6 changes: 3 additions & 3 deletions example/pubspec.lock
Expand Up @@ -333,9 +333,9 @@ packages:
smartstruct:
dependency: "direct main"
description:
name: smartstruct
url: "https://pub.dartlang.org"
source: hosted
path: "../smartstruct"
relative: true
source: path
version: "1.2.6"
smartstruct_generator:
dependency: "direct dev"
Expand Down
3 changes: 3 additions & 0 deletions example/pubspec.yaml
Expand Up @@ -17,3 +17,6 @@ dev_dependencies:
#smartstruct_generator: ^1.2.6
smartstruct_generator:
path: ../generator
dependency_overrides:
smartstruct:
path: ../smartstruct
10 changes: 10 additions & 0 deletions generator/lib/code_builders/class_builder.dart
Expand Up @@ -4,6 +4,7 @@ import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:code_builder/code_builder.dart';
import 'package:smartstruct_generator/code_builders/method_builder.dart';
import 'package:smartstruct_generator/code_builders/static_proxy_builder.dart';
import 'parameter_copy.dart';

Library buildMapperClass(
Expand All @@ -12,10 +13,19 @@ Library buildMapperClass(
[
_generateMapperImplementationClass(abstractClass, config),
..._generateStaticMethods(abstractClass, config),
..._generateStaticProxy(abstractClass, config),
],
));
}

List<Class> _generateStaticProxy(
ClassElement abstractClass, Map<String, dynamic> config) {
if(config['generateStaticProxy']) {
return [generateStaticProxy(abstractClass)];
}
return [];
}

List<Method> _generateStaticMethods(
ClassElement abstractClass, Map<String, dynamic> config) {
// I have no idea why the static methods needed to be generated.
Expand Down
34 changes: 34 additions & 0 deletions generator/lib/code_builders/static_proxy_builder.dart
@@ -0,0 +1,34 @@

import 'package:analyzer/dart/element/element.dart';
import 'package:code_builder/code_builder.dart';
import 'package:smartstruct_generator/code_builders/parameter_copy.dart';

Class generateStaticProxy(ClassElement abstractMapper) {
return Class(
(b) => b
..name = '${abstractMapper.displayName}\$'
..fields.add(Field((f) =>
f..name = "mapper"
..modifier = FieldModifier.final$
..type = refer(abstractMapper.thisType.getDisplayString(withNullability: true))
..assignment = refer('${abstractMapper.name}Impl()').code
..static = true
))
..methods.addAll(abstractMapper.methods
.where((method) => method.isAbstract)
.map((method) =>
buildStaticMethod(method, abstractMapper))),
);
}

Method buildStaticMethod(MethodElement method, ClassElement element) {
final argList = method.parameters.map((e) => copyParameter(e));
final argNameList = method.parameters.map((e) => refer(e.name));
return Method((b) =>
b..static = true
..name = method.displayName
..requiredParameters.addAll(argList)
..body = refer("mapper.${method.displayName}").call(argNameList).code
..returns = refer(method.returnType.getDisplayString(withNullability: true))
);
}
6 changes: 3 additions & 3 deletions generator/pubspec.lock
Expand Up @@ -340,9 +340,9 @@ packages:
smartstruct:
dependency: "direct main"
description:
name: smartstruct
url: "https://pub.dartlang.org"
source: hosted
path: "../smartstruct"
relative: true
source: path
version: "1.2.6"
source_gen:
dependency: "direct main"
Expand Down
3 changes: 3 additions & 0 deletions generator/pubspec.yaml
Expand Up @@ -18,3 +18,6 @@ dependencies:
# path: ../smartstruct
smartstruct: ^1.2.6
source_gen: ^1.2.1
dependency_overrides:
smartstruct:
path: ../smartstruct
1 change: 1 addition & 0 deletions generator/test/mapper_test.dart
Expand Up @@ -41,5 +41,6 @@ const _expectedAnnotatedTests = {
'StaticMappingMapper',
'NestedGenericMapper',
'PassOnMapperFunctionMapper',
'StaticProxyMapper',
'MapperInheritanceMapper',
};
1 change: 1 addition & 0 deletions generator/test/src/mapper_test_input.dart
Expand Up @@ -22,6 +22,7 @@ part 'nullable_nested_mapper_input.dart';
part 'nested_mapping_after_function_mapping_input.dart';
part 'nullable_list_mapper_input.dart';
part 'pass_on_mapper_function_mapper_input.dart';
part 'static_proxy_input.dart';
part 'mapper_inheritance_input.dart';

@ShouldThrow('theAnswer is not a class and cannot be annotated with @Mapper')
Expand Down
40 changes: 40 additions & 0 deletions generator/test/src/static_proxy_input.dart
@@ -0,0 +1,40 @@

part of 'mapper_test_input.dart';


class StaticProxyTarget {
final String text;
final num number;

StaticProxyTarget(this.text, this.number);
}

class StaticProxySource {
final String text;
final num number;

StaticProxySource(this.text, this.number);
}

@Mapper(generateStaticProxy: true)
@ShouldGenerate('''
class StaticProxyMapperImpl extends StaticProxyMapper {
StaticProxyMapperImpl() : super();

@override
StaticProxyTarget fromSourceNormal(StaticMappingSource source) {
final staticproxytarget = StaticProxyTarget(source.text, source.number);
return staticproxytarget;
}
}

class StaticProxyMapper\$ {
static final StaticProxyMapper mapper = StaticProxyMapperImpl();

static StaticProxyTarget fromSourceNormal(StaticMappingSource source) =>
mapper.fromSourceNormal(source);
}
''')
abstract class StaticProxyMapper {
StaticProxyTarget fromSourceNormal(StaticMappingSource source);
}
3 changes: 2 additions & 1 deletion smartstruct/lib/src/annotations.dart
Expand Up @@ -4,8 +4,9 @@
class Mapper {
final bool useInjection;
final bool caseSensitiveFields;
final bool generateStaticProxy;

const Mapper({this.useInjection = false, this.caseSensitiveFields = false});
const Mapper({this.useInjection = false, this.caseSensitiveFields = false, this.generateStaticProxy = false});
}

const mapper = Mapper();
Expand Down