OLD | NEW |
1 // Copyright (c) 2015, the Dart Team. All rights reserved. Use of this | 1 // Copyright (c) 2015, the Dart Team. All rights reserved. Use of this |
2 // source code is governed by a BSD-style license that can be found in | 2 // source code is governed by a BSD-style license that can be found in |
3 // the LICENSE file. | 3 // the LICENSE file. |
4 | 4 |
5 library reflectable.transformer; | 5 library reflectable.transformer; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:io'; | 8 import 'dart:io'; |
9 import 'package:barback/barback.dart'; | 9 import 'package:barback/barback.dart'; |
10 import 'package:logging/logging.dart'; | 10 import 'package:logging/logging.dart'; |
11 import 'src/transformer_implementation.dart' as implementation; | 11 import 'src/transformer_implementation.dart' as implementation; |
12 | 12 |
13 class ReflectableTransformer extends AggregateTransformer | 13 class ReflectableTransformer extends AggregateTransformer |
14 implements DeclaringAggregateTransformer { | 14 implements DeclaringAggregateTransformer { |
15 BarbackSettings _settings; | 15 BarbackSettings _settings; |
16 List<String> _entryPoints = <String>[]; | 16 List<String> _entryPoints = <String>[]; |
17 bool _formatted; | 17 bool _formatted; |
| 18 List<implementation.WarningKind> _suppressWarnings = |
| 19 <implementation.WarningKind>[]; |
18 | 20 |
19 /// Reports an error in a situation where we do not yet have | 21 /// Reports an error in a situation where we do not yet have |
20 /// a [Logger]. | 22 /// a [Logger]. |
21 void _reportEarlyError(String message) { | 23 void _reportEarlyError(String message) { |
22 print("Error(Reflectable): $message."); | 24 print("Error(Reflectable): $message."); |
23 exit(-1); | 25 exit(-1); |
24 } | 26 } |
25 | 27 |
26 /// Reports an info message in a situation where we do not yet have | 28 /// Reports an info message in a situation where we do not yet have |
27 /// a [Logger]. | 29 /// a [Logger]. |
(...skipping 29 matching lines...) Expand all Loading... |
57 if (formattedSettings == null) { | 59 if (formattedSettings == null) { |
58 return false; | 60 return false; |
59 } else if (formattedSettings is! bool) { | 61 } else if (formattedSettings is! bool) { |
60 _reportEarlyError("Encountered non-bool value for 'formatted' option."); | 62 _reportEarlyError("Encountered non-bool value for 'formatted' option."); |
61 return false; | 63 return false; |
62 } else { | 64 } else { |
63 return formattedSettings; | 65 return formattedSettings; |
64 } | 66 } |
65 } | 67 } |
66 | 68 |
| 69 List<implementation.WarningKind> _findSuppressWarnings( |
| 70 suppressWarningsSettings) { |
| 71 void fail(setting) { |
| 72 _reportEarlyError("Encountered unknown value '$setting' for" |
| 73 " the 'suppressWarnings' option.\n" |
| 74 "Accepted values: true, false, missingEntryPoint, " |
| 75 "badSuperclass, badNamePattern, badMetadata"); |
| 76 } |
| 77 |
| 78 Iterable<implementation.WarningKind> helper(setting) sync* { |
| 79 // With no settings, no warnings are suppressed; same for `false`. |
| 80 if (setting == null || setting == false) return; |
| 81 // Setting `true` means suppress them all. |
| 82 if (setting == true) { |
| 83 yield* implementation.WarningKind.values; |
| 84 } else if (setting is String) { |
| 85 switch (setting) { |
| 86 case "missingEntryPoint": |
| 87 yield implementation.WarningKind.missingEntryPoint; |
| 88 break; |
| 89 case "badSuperclass": |
| 90 yield implementation.WarningKind.badSuperclass; |
| 91 break; |
| 92 case "badNamePattern": |
| 93 yield implementation.WarningKind.badNamePattern; |
| 94 break; |
| 95 case "badMetadata": |
| 96 yield implementation.WarningKind.badMetadata; |
| 97 break; |
| 98 default: |
| 99 fail(setting); |
| 100 return; |
| 101 } |
| 102 } else { |
| 103 fail(setting); |
| 104 return; |
| 105 } |
| 106 } |
| 107 |
| 108 List<implementation.WarningKind> result = <implementation.WarningKind>[]; |
| 109 if (suppressWarningsSettings is Iterable) { |
| 110 suppressWarningsSettings |
| 111 .forEach((setting) => helper(setting).forEach(result.add)); |
| 112 } else { |
| 113 result.addAll(helper(suppressWarningsSettings)); |
| 114 } |
| 115 return new List<implementation.WarningKind>.unmodifiable(result); |
| 116 } |
| 117 |
67 /// Creates new instance as required by Barback. | 118 /// Creates new instance as required by Barback. |
68 ReflectableTransformer.asPlugin(this._settings) { | 119 ReflectableTransformer.asPlugin(this._settings) { |
69 _entryPoints = _findEntryPoints(_settings.configuration['entry_points']); | 120 _entryPoints = _findEntryPoints(_settings.configuration['entry_points']); |
70 _formatted = _findFormatted(_settings.configuration['formatted']); | 121 _formatted = _findFormatted(_settings.configuration['formatted']); |
| 122 _suppressWarnings = |
| 123 _findSuppressWarnings(_settings.configuration['suppressWarnings']); |
71 } | 124 } |
72 | 125 |
73 /// Return a [String] or [Future<String>] valued key for each | 126 /// Return a [String] or [Future<String>] valued key for each |
74 /// primary asset that this transformer wishes to process, and | 127 /// primary asset that this transformer wishes to process, and |
75 /// null for assets that it wishes to ignore. Primary assets | 128 /// null for assets that it wishes to ignore. Primary assets |
76 /// with the same key are delivered to [apply] as a group. In | 129 /// with the same key are delivered to [apply] as a group. In |
77 /// this transformer we handle the grouping later, so everything | 130 /// this transformer we handle the grouping later, so everything |
78 /// is in the same group. | 131 /// is in the same group. |
79 String classifyPrimary(AssetId id) { | 132 String classifyPrimary(AssetId id) { |
80 return _entryPoints.any((entryPoint) => id.path.endsWith(entryPoint)) | 133 return _entryPoints.any((entryPoint) => id.path.endsWith(entryPoint)) |
81 ? "ReflectableTransformed" | 134 ? "ReflectableTransformed" |
82 : null; | 135 : null; |
83 } | 136 } |
84 | 137 |
85 /// Performs the transformation. | 138 /// Performs the transformation. |
86 @override | 139 @override |
87 Future apply(AggregateTransform transform) { | 140 Future apply(AggregateTransform transform) { |
88 return new implementation.TransformerImplementation() | 141 return new implementation.TransformerImplementation() |
89 .apply(transform, _entryPoints, _formatted); | 142 .apply(transform, _entryPoints, _formatted, _suppressWarnings); |
90 } | 143 } |
91 | 144 |
92 @override | 145 @override |
93 declareOutputs(DeclaringAggregateTransform transform) async { | 146 declareOutputs(DeclaringAggregateTransform transform) async { |
94 List<AssetId> ids = await transform.primaryIds.toList(); | 147 List<AssetId> ids = await transform.primaryIds.toList(); |
95 _entryPoints.forEach((String entryPoint) { | 148 _entryPoints.forEach((String entryPoint) { |
96 AssetId id = ids.firstWhere((AssetId id) => id.path.endsWith(entryPoint), | 149 AssetId id = ids.firstWhere((AssetId id) => id.path.endsWith(entryPoint), |
97 orElse: () => null); | 150 orElse: () => null); |
98 if (id == null) { | 151 if (id == null) { |
99 // There is no such entry point; however, we do not need to emit | 152 // There is no such entry point; however, we do not need to emit |
100 // any diagnostic messages, this is done by `apply` in | 153 // any diagnostic messages, this is done by `apply` in |
101 // `TransformerImplementation`. | 154 // `TransformerImplementation`. |
102 return; | 155 return; |
103 } | 156 } |
104 transform.declareOutput(id); | 157 transform.declareOutput(id); |
105 AssetId dataId = id.changeExtension("_reflectable_original_main.dart"); | 158 AssetId dataId = id.changeExtension("_reflectable_original_main.dart"); |
106 transform.declareOutput(dataId); | 159 transform.declareOutput(dataId); |
107 }); | 160 }); |
108 } | 161 } |
109 } | 162 } |
OLD | NEW |