@@ -7,6 +7,7 @@ import 'dart:collection';
7
7
import 'package:analyzer/src/generated/ast.dart' ;
8
8
import 'package:analyzer/src/generated/source.dart' ;
9
9
import 'package:analyzer/src/generated/element.dart' ;
10
+ import 'package:args/args.dart' ;
10
11
import 'package:di/generator.dart' ;
11
12
12
13
const String PACKAGE_PREFIX = 'package:' ;
@@ -21,64 +22,123 @@ primeTemplateCache(TemplateCache tc) {
21
22
''' ;
22
23
23
24
const String FILE_FOOTER = '}' ;
24
- const SYSTEM_PACKAGE_ROOT = '%SYSTEM_PACKAGE_ROOT%' ;
25
-
26
- main (args) {
27
- if (args.length < 4 ) {
28
- print ('Usage: templace_cache_generator path_to_entry_point sdk_path '
29
- 'output package_root1,package_root2,...|$SYSTEM_PACKAGE_ROOT '
30
- 'patternUrl1,rewriteTo1;patternUrl2,rewriteTo2 '
31
- 'blacklistClass1,blacklistClass2' );
32
- exit (1 );
33
- }
34
-
35
- var entryPoint = args[0 ];
36
- var sdkPath = args[1 ];
37
- var output = args[2 ];
38
- var outputLibrary = args[3 ];
39
- var packageRoots = args[4 ] == SYSTEM_PACKAGE_ROOT ?
40
- [Platform .packageRoot] : args[4 ].split (',' );
41
- Map <RegExp , String > urlRewriters = parseUrlRemapping (args[5 ]);
42
- Set <String > blacklistedClasses = (args.length > 6 )
43
- ? new Set .from (args[6 ].split (',' ))
44
- : new Set ();
45
-
46
- print ('sdkPath: $sdkPath ' );
47
- print ('entryPoint: $entryPoint ' );
48
- print ('output: $output ' );
49
- print ('outputLibrary: $outputLibrary ' );
50
- print ('packageRoots: $packageRoots ' );
51
- print ('url rewritters: ' + args[5 ]);
52
- print ('blacklistedClasses: ' + blacklistedClasses.join (', ' ));
53
25
26
+ main (List arguments) {
27
+ Options options = parseArgs (arguments);
28
+ if (options.verbose) {
29
+ print ('entryPoint: ${options .entryPoint }' );
30
+ print ('outputLibrary: ${options .outputLibrary }' );
31
+ print ('output: ${options .output }' );
32
+ print ('sdk-path: ${options .sdkPath }' );
33
+ print ('package-root: ${options .packageRoots .join ("," )}' );
34
+ var rewrites = options.urlRewrites.keys
35
+ .map ((k) => '${k .pattern },${options .urlRewrites [k ]}' )
36
+ .join (';' );
37
+ print ('url-rewrites: $rewrites ' );
38
+ print ('skip-classes: ${options .skippedClasses .join ("," )}' );
39
+ }
54
40
55
41
Map <String , String > templates = {};
56
42
57
- var c = new SourceCrawler (sdkPath, packageRoots);
43
+ var c = new SourceCrawler (options. sdkPath, options. packageRoots);
58
44
var visitor =
59
- new TemplateCollectingVisitor (templates, blacklistedClasses , c);
60
- c.crawl (entryPoint,
45
+ new TemplateCollectingVisitor (templates, options.skippedClasses , c);
46
+ c.crawl (options. entryPoint,
61
47
(CompilationUnitElement compilationUnit, SourceFile source) =>
62
48
visitor (compilationUnit, source.canonicalPath));
63
49
64
- var sink = new File (output).openWrite ();
50
+ var sink;
51
+ if (options.output == '-' ) {
52
+ sink = stdout;
53
+ } else {
54
+ var f = new File (options.output)..createSync (recursive: true );
55
+ sink = f.openWrite ();
56
+ }
65
57
return printTemplateCache (
66
- templates, urlRewriters, outputLibrary, sink).then ((_) {
67
- return sink.flush ();
68
- });
58
+ templates, options.urlRewrites, options.outputLibrary, sink)
59
+ .then ((_) => sink.flush ());
60
+ }
61
+
62
+ class Options {
63
+ String entryPoint;
64
+ String outputLibrary;
65
+ String sdkPath;
66
+ List <String > packageRoots;
67
+ String output;
68
+ Map <RegExp , String > urlRewrites;
69
+ Set <String > skippedClasses;
70
+ bool verbose;
69
71
}
70
72
71
- Map <RegExp , String > parseUrlRemapping (String argument) {
72
- Map <RegExp , String > result = new LinkedHashMap ();
73
- if (argument.isEmpty) {
74
- return result;
73
+ Options parseArgs (List arguments) {
74
+ var parser = new ArgParser ()
75
+ ..addOption ('sdk-path' , abbr: 's' ,
76
+ defaultsTo: Platform .environment['DART_SDK' ],
77
+ help: 'Dart SDK Path' )
78
+ ..addOption ('package-root' , abbr: 'p' , defaultsTo: Platform .packageRoot,
79
+ help: 'comma-separated list of package roots' )
80
+ ..addOption ('out' , abbr: 'o' , defaultsTo: '-' ,
81
+ help: 'output file or "-" for stdout' )
82
+ ..addOption ('url-rewrites' , abbr: 'u' ,
83
+ help: 'semicolon-separated list of URL rewrite rules, of the form: '
84
+ 'patternUrl,rewriteTo' )
85
+ ..addOption ('skip-classes' , abbr: 'b' ,
86
+ help: 'comma-separated list of classes to skip templating' )
87
+ ..addFlag ('verbose' , abbr: 'v' , help: 'verbose output' )
88
+ ..addFlag ('help' , abbr: 'h' , negatable: false , help: 'show this help' );
89
+
90
+ printUsage () {
91
+ print ('Usage: dart template_cache_generator.dart '
92
+ '--sdk-path=path [OPTION...] entryPoint libraryName' );
93
+ print (parser.getUsage ());
75
94
}
76
95
77
- argument.split (";" ).forEach ((String pair) {
78
- List <String > remapping = pair.split ("," );
79
- result[new RegExp (remapping[0 ])] = remapping[1 ];
80
- });
81
- return result;
96
+ fail (message) {
97
+ print ('Error: $message \n ' );
98
+ printUsage ();
99
+ exit (1 );
100
+ }
101
+
102
+ var args;
103
+ try {
104
+ args = parser.parse (arguments);
105
+ } catch (e) {
106
+ fail ('failed to parse arguments' );
107
+ }
108
+
109
+ if (args['help' ]) {
110
+ printUsage ();
111
+ exit (0 );
112
+ }
113
+
114
+ if (args['sdk-path' ] == null ) {
115
+ fail ('--sdk-path must be specified' );
116
+ }
117
+
118
+ var options = new Options ();
119
+ options.sdkPath = args['sdk-path' ];
120
+ options.packageRoots = args['package-root' ].split (',' );
121
+ options.output = args['out' ];
122
+ if (args['url-rewrites' ] != null ) {
123
+ options.urlRewrites = new LinkedHashMap .fromIterable (
124
+ args['url-rewrites' ].split (';' ).map ((p) => p.split (',' )),
125
+ key: (p) => new RegExp (p[0 ]),
126
+ value: (p) => p[1 ]);
127
+ } else {
128
+ options.urlRewrites = {};
129
+ }
130
+ if (args['skip-classes' ] != null ) {
131
+ options.skippedClasses = new Set .from (args['skip-classes' ].split (',' ));
132
+ } else {
133
+ options.skippedClasses = new Set ();
134
+ }
135
+ options.verbose = args['verbose' ];
136
+ if (args.rest.length != 2 ) {
137
+ fail ('unexpected arguments: ${args .rest .join (' ' )}' );
138
+ }
139
+ options.entryPoint = args.rest[0 ];
140
+ options.outputLibrary = args.rest[1 ];
141
+ return options;
82
142
}
83
143
84
144
printTemplateCache (Map <String , String > templateKeyMap,
@@ -112,10 +172,10 @@ printTemplateCache(Map<String, String> templateKeyMap,
112
172
113
173
class TemplateCollectingVisitor {
114
174
Map <String , String > templates;
115
- Set <String > blacklistedClasses ;
175
+ Set <String > skippedClasses ;
116
176
SourceCrawler sourceCrawler;
117
177
118
- TemplateCollectingVisitor (this .templates, this .blacklistedClasses ,
178
+ TemplateCollectingVisitor (this .templates, this .skippedClasses ,
119
179
this .sourceCrawler);
120
180
121
181
void call (CompilationUnitElement cue, String srcPath) {
@@ -137,7 +197,7 @@ class TemplateCollectingVisitor {
137
197
bool cache = true ;
138
198
clazz.metadata.forEach ((Annotation ann) {
139
199
if (ann.arguments == null ) return ; // Ignore non-class annotations.
140
- if (blacklistedClasses .contains (clazz.name.name)) return ;
200
+ if (skippedClasses .contains (clazz.name.name)) return ;
141
201
142
202
switch (ann.name.name) {
143
203
case 'NgComponent' :
0 commit comments