-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathclient_code_generator.dart
More file actions
105 lines (96 loc) · 3.44 KB
/
client_code_generator.dart
File metadata and controls
105 lines (96 loc) · 3.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import 'dart:async';
import 'package:celest_ast/celest_ast.dart' as ast;
import 'package:celest_cli/src/codegen/allocator.dart';
import 'package:celest_cli/src/codegen/client/client_generator.dart';
import 'package:celest_cli/src/codegen/code_generator.dart';
import 'package:celest_cli/src/codegen/code_outputs.dart';
import 'package:celest_cli/src/context.dart';
import 'package:celest_cli/src/project/celest_project.dart';
import 'package:celest_cli/src/pub/project_dependency.dart';
import 'package:celest_cli/src/pub/pub_action.dart';
import 'package:celest_cli/src/pub/pubspec.dart';
import 'package:collection/collection.dart';
import 'package:logging/logging.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:pubspec_parse/pubspec_parse.dart';
final class ClientCodeGenerator {
ClientCodeGenerator({
required this.project,
required this.resolvedProject,
required this.projectUris,
});
final ast.Project project;
final ast.ResolvedProject resolvedProject;
final CelestProjectUris projectUris;
CodeOutputs generate() {
final clientDeps = CodegenDependencies(rootDir: projectPaths.clientRoot);
final outputs = runZoned(() {
final generator = ClientGenerator(
project: project,
resolvedProject: resolvedProject,
projectUris: projectUris,
);
return generator.generate();
}, zoneValues: {CodegenDependencies: clientDeps});
return CodeOutputs(
outputs.map(
(path, library) => MapEntry(
path,
CodeGenerator.emit(
library,
forFile: path,
prefixingStrategy: PrefixingStrategy.pretty,
pathStrategy: PathStrategy.pretty,
),
),
),
codegenDependencies: clientDeps,
);
}
}
final class CodegenDependencies extends DelegatingSet<String> {
CodegenDependencies({required this.rootDir}) : super({});
final String rootDir;
static CodegenDependencies get current {
return Zone.current[CodegenDependencies] as CodegenDependencies;
}
static final Logger _logger = Logger('CodegenDependencies');
Future<bool> save() async {
var (pubspec, pubspecYaml) =
p.equals(rootDir, projectPaths.projectRoot)
? (celestProject.pubspec, celestProject.pubspecYaml)
: (celestProject.clientPubspec, celestProject.clientPubspecYaml);
final pubspecFile = fileSystem.directory(rootDir).childFile('pubspec.yaml');
final currentDependencies = Set.of(pubspec.dependencies.keys);
final missingDependencies = difference(currentDependencies);
final needsUpdate = missingDependencies.isNotEmpty;
if (needsUpdate) {
_logger.fine(
'Adding dependencies to ${pubspecFile.path}: '
'${missingDependencies.toList()}',
);
pubspec = pubspec.addDeps(
dependencies: {
for (final dependency in this)
dependency:
ProjectDependency.all[dependency]?.pubDependency ??
HostedDependency(version: VersionConstraint.any),
},
);
if (pubspecFile.existsSync()) {
await pubspecFile.writeAsString(pubspec.toYaml(source: pubspecYaml));
await runPub(
action: PubAction.get,
workingDirectory: pubspecFile.parent.path,
);
} else {
_logger.fine(
'Skipping dependency update',
'Pubspec not found: ${pubspecFile.path}',
StackTrace.current,
);
}
}
return needsUpdate;
}
}