| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 library initialize.build.initializer_plugin; | 4 library initialize.build.initializer_plugin; |
| 5 | 5 |
| 6 import 'package:analyzer/dart/ast/ast.dart'; | 6 import 'package:analyzer/dart/ast/ast.dart'; |
| 7 import 'package:analyzer/dart/element/element.dart'; | 7 import 'package:analyzer/dart/element/element.dart'; |
| 8 import 'package:analyzer/src/generated/constant.dart'; | 8 import 'package:analyzer/src/generated/constant.dart'; |
| 9 import 'package:barback/barback.dart'; | 9 import 'package:barback/barback.dart'; |
| 10 import 'package:code_transformers/resolver.dart'; | 10 import 'package:code_transformers/resolver.dart'; |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 buffer.write('}'); | 228 buffer.write('}'); |
| 229 } else if (expression is Identifier) { | 229 } else if (expression is Identifier) { |
| 230 var element = expression.bestElement; | 230 var element = expression.bestElement; |
| 231 if (element == null) { | 231 if (element == null) { |
| 232 logger.error('Unable to get `bestElement` for expression: $expression'); | 232 logger.error('Unable to get `bestElement` for expression: $expression'); |
| 233 } else if (!element.isPublic) { | 233 } else if (!element.isPublic) { |
| 234 // Inline the evaluated value of private identifiers. | 234 // Inline the evaluated value of private identifiers. |
| 235 buffer.write(_evaluateExpression(expression, pluginData)); | 235 buffer.write(_evaluateExpression(expression, pluginData)); |
| 236 } else { | 236 } else { |
| 237 libraryPrefixes.putIfAbsent( | 237 libraryPrefixes.putIfAbsent( |
| 238 element.library, () => 'i${libraryPrefixes.length}'); | 238 element.library, () => 'i${libraryPrefixes.length}'); |
| 239 | 239 |
| 240 buffer.write('${libraryPrefixes[element.library]}.'); | 240 buffer.write('${libraryPrefixes[element.library]}.'); |
| 241 if (element is ClassElement) { | 241 if (element is ClassElement) { |
| 242 buffer.write(element.name); | 242 buffer.write(element.name); |
| 243 } else if (element is PropertyAccessorElement) { | 243 } else if (element is PropertyAccessorElement) { |
| 244 var variable = element.variable; | 244 var variable = element.variable; |
| 245 if (variable is FieldElement) { | 245 if (variable is FieldElement) { |
| 246 buffer.write('${variable.enclosingElement.name}.'); | 246 buffer.write('${variable.enclosingElement.name}.'); |
| 247 } | 247 } |
| 248 buffer.write('${variable.name}'); | 248 buffer.write('${variable.name}'); |
| 249 } else { | 249 } else { |
| 250 logger.error('Unsupported argument to initializer constructor.'); | 250 logger.error('Unsupported argument to initializer constructor.'); |
| 251 } | 251 } |
| 252 } | 252 } |
| 253 } else if (expression is PropertyAccess) { | 253 } else if (expression is PropertyAccess) { |
| 254 buffer.write(buildExpression(expression.target, pluginData)); | 254 buffer.write(buildExpression(expression.target, pluginData)); |
| 255 buffer.write('.${expression.propertyName}'); | 255 buffer.write('.${expression.propertyName}'); |
| 256 } else if (expression is InstanceCreationExpression) { | 256 } else if (expression is InstanceCreationExpression) { |
| 257 logger.error('Unsupported expression in initializer, found $expression. ' | 257 logger.error('Unsupported expression in initializer, found $expression. ' |
| 258 'Instance creation expressions are not supported (yet). Instead, ' | 258 'Instance creation expressions are not supported (yet). Instead, ' |
| 259 'please assign it to a const variable and use that instead.'); | 259 'please assign it to a const variable and use that instead.'); |
| 260 } else { | 260 } else { |
| 261 buffer.write(_evaluateExpression(expression, pluginData)); | 261 buffer.write(_evaluateExpression(expression, pluginData)); |
| 262 } | 262 } |
| 263 return buffer.toString(); | 263 return buffer.toString(); |
| 264 } | 264 } |
| 265 | 265 |
| 266 _evaluateExpression( | 266 _evaluateExpression(Expression expression, InitializerPluginData pluginData) { |
| 267 Expression expression, InitializerPluginData pluginData) { | |
| 268 var logger = pluginData.logger; | 267 var logger = pluginData.logger; |
| 269 var result = pluginData.resolver.evaluateConstant( | 268 var result = pluginData.resolver.evaluateConstant( |
| 270 pluginData.initializer.targetElement.library, expression); | 269 pluginData.initializer.targetElement.library, expression); |
| 271 if (!result.isValid) { | 270 if (!result.isValid) { |
| 272 logger.error('Invalid expression in initializer, found $expression. ' | 271 logger.error('Invalid expression in initializer, found $expression. ' |
| 273 'And got the following errors: ${result.errors}.'); | 272 'And got the following errors: ${result.errors}.'); |
| 274 return null; | 273 return null; |
| 275 } | 274 } |
| 276 | 275 |
| 277 var value = _getValue(result.value); | 276 var value = _getValue(result.value); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 295 } | 294 } |
| 296 | 295 |
| 297 // Gets an actual value for a [DartObject]. | 296 // Gets an actual value for a [DartObject]. |
| 298 _getValue(DartObject object) { | 297 _getValue(DartObject object) { |
| 299 if (object == null) return null; | 298 if (object == null) return null; |
| 300 var value = object.toBoolValue() ?? | 299 var value = object.toBoolValue() ?? |
| 301 object.toDoubleValue() ?? | 300 object.toDoubleValue() ?? |
| 302 object.toIntValue() ?? | 301 object.toIntValue() ?? |
| 303 object.toStringValue(); | 302 object.toStringValue(); |
| 304 if (value == null) { | 303 if (value == null) { |
| 305 value = object.toListValue(); | 304 List list = object.toListValue(); |
| 306 if (value != null) { | 305 if (list != null) { |
| 307 return value.map((DartObject element) => _getValue(element)).toList(); | 306 return list.map((DartObject element) => _getValue(element)).toList(); |
| 308 } | 307 } |
| 309 Map<DartObject, DartObject> map = object.toMapValue(); | 308 Map<DartObject, DartObject> map = object.toMapValue(); |
| 310 if (map != null) { | 309 if (map != null) { |
| 311 Map result = {}; | 310 Map result = {}; |
| 312 map.forEach((DartObject key, DartObject value) { | 311 map.forEach((DartObject key, DartObject value) { |
| 313 dynamic mappedKey = _getValue(key); | 312 dynamic mappedKey = _getValue(key); |
| 314 if (mappedKey != null) { | 313 if (mappedKey != null) { |
| 315 result[mappedKey] = _getValue(value); | 314 result[mappedKey] = _getValue(value); |
| 316 } | 315 } |
| 317 }); | 316 }); |
| 318 return result; | 317 return result; |
| 319 } | 318 } |
| 320 } | 319 } |
| 321 return value; | 320 return value; |
| 322 } | 321 } |
| 323 } | 322 } |
| OLD | NEW |