refactor(dart/transform): Create common dumbEval function

This commit is contained in:
Tim Blasi 2015-10-13 17:09:52 -07:00
parent 150d3686c3
commit b318945680
3 changed files with 35 additions and 29 deletions

View File

@ -12,6 +12,8 @@ import 'package:angular2/src/transform/common/annotation_matcher.dart';
import 'package:angular2/src/transform/common/interface_matcher.dart'; import 'package:angular2/src/transform/common/interface_matcher.dart';
import 'package:barback/barback.dart' show AssetId; import 'package:barback/barback.dart' show AssetId;
import 'dumb_eval.dart';
class DirectiveMetadataReader { class DirectiveMetadataReader {
final _DirectiveMetadataVisitor _visitor; final _DirectiveMetadataVisitor _visitor;
final TemplateCompiler _templateCompiler; final TemplateCompiler _templateCompiler;
@ -53,22 +55,11 @@ class DirectiveMetadataReader {
} }
} }
/// Visitor that attempts to evaluate a provided `node` syntactically.
///
/// This lack of semantic information means it cannot do much - for
/// example, it can create a list from a list literal and combine adjacent
/// strings but cannot determine that an identifier is a constant string,
/// even if that identifier is defined in the same [CompilationUnit].
///
/// Returns the result of evaluation or [ConstantEvaluator.NOT_A_CONSTANT]
/// where appropriate.
final ConstantEvaluator _evaluator = new ConstantEvaluator();
/// Evaluates the [Map] represented by `expression` and adds all `key`, /// Evaluates the [Map] represented by `expression` and adds all `key`,
/// `value` pairs to `map`. If `expression` does not evaluate to a [Map], /// `value` pairs to `map`. If `expression` does not evaluate to a [Map],
/// throws a descriptive [FormatException]. /// throws a descriptive [FormatException].
void _populateMap(Expression expression, Map map, String propertyName) { void _populateMap(Expression expression, Map map, String propertyName) {
var evaluated = expression.accept(_evaluator); var evaluated = dumbEval(expression);
if (evaluated is! Map) { if (evaluated is! Map) {
throw new FormatException( throw new FormatException(
'Angular 2 expects a Map but could not understand the value for ' 'Angular 2 expects a Map but could not understand the value for '
@ -87,7 +78,7 @@ void _populateMap(Expression expression, Map map, String propertyName) {
/// descriptive [FormatException]. /// descriptive [FormatException].
void _populateList( void _populateList(
Expression expression, List<String> list, String propertyName) { Expression expression, List<String> list, String propertyName) {
var evaluated = expression.accept(_evaluator); var evaluated = dumbEval(expression);
if (evaluated is! List) { if (evaluated is! List) {
throw new FormatException( throw new FormatException(
'Angular 2 expects a List but could not understand the value for ' 'Angular 2 expects a List but could not understand the value for '
@ -100,7 +91,7 @@ void _populateList(
/// Evaluates `node` and expects that the result will be a string. If not, /// Evaluates `node` and expects that the result will be a string. If not,
/// throws a [FormatException]. /// throws a [FormatException].
String _expressionToString(Expression node, String nodeDescription) { String _expressionToString(Expression node, String nodeDescription) {
var value = node.accept(_evaluator); var value = dumbEval(node);
if (value is! String) { if (value is! String) {
throw new FormatException( throw new FormatException(
'Angular 2 could not understand the value ' 'Angular 2 could not understand the value '

View File

@ -0,0 +1,26 @@
library angular2.transform.common.dumb_eval;
import 'package:analyzer/analyzer.dart';
final _constantEvaluator = new ConstantEvaluator();
/// The value returned if the result of `dumbEval` is not a constant.
final NOT_A_CONSTANT = ConstantEvaluator.NOT_A_CONSTANT;
/// Performs a very limited syntactic evaluation of `expr`.
///
/// This lack of semantic information means this method cannot do much - for
/// example, it can create a list from a list literal and combine adjacent
/// strings but cannot determine that an identifier is a constant string,
/// even if that identifier is defined in the same [CompilationUnit].
///
/// Returns the result of evaluation or [NOT_A_CONSTANT] where appropriate.
dynamic dumbEval(Expression expr) {
var val;
if (expr is SimpleStringLiteral) {
val = stringLiteralToString(expr);
} else {
val = expr.accept(_constantEvaluator);
}
return val != NOT_A_CONSTANT ? val : null;
}

View File

@ -7,6 +7,7 @@ import 'package:analyzer/src/generated/ast.dart';
import 'package:angular2/src/core/compiler/xhr.dart' show XHR; import 'package:angular2/src/core/compiler/xhr.dart' show XHR;
import 'package:angular2/src/transform/common/annotation_matcher.dart'; import 'package:angular2/src/transform/common/annotation_matcher.dart';
import 'package:angular2/src/transform/common/asset_reader.dart'; import 'package:angular2/src/transform/common/asset_reader.dart';
import 'package:angular2/src/transform/common/dumb_eval.dart';
import 'package:angular2/src/transform/common/async_string_writer.dart'; import 'package:angular2/src/transform/common/async_string_writer.dart';
import 'package:angular2/src/transform/common/logging.dart'; import 'package:angular2/src/transform/common/logging.dart';
import 'package:angular2/src/transform/common/options.dart'; import 'package:angular2/src/transform/common/options.dart';
@ -119,7 +120,7 @@ class _ViewPropInliner extends RecursiveAstVisitor<Object> {
@override @override
Object visitNamedExpression(NamedExpression node) { Object visitNamedExpression(NamedExpression node) {
if (_isInlining && node is NamedExpression) { if (_isInlining) {
if (node.name is! Label || node.name.label is! SimpleIdentifier) { if (node.name is! Label || node.name.label is! SimpleIdentifier) {
throw new FormatException( throw new FormatException(
'Angular 2 currently only supports simple identifiers in directives.', 'Angular 2 currently only supports simple identifiers in directives.',
@ -141,7 +142,7 @@ class _ViewPropInliner extends RecursiveAstVisitor<Object> {
} }
void _populateStyleUrls(NamedExpression node) { void _populateStyleUrls(NamedExpression node) {
var urls = _dumbEval(node.expression); var urls = dumbEval(node.expression);
if (urls is! List) { if (urls is! List) {
logger.warning('styleUrls is not a List of Strings (${node.expression})'); logger.warning('styleUrls is not a List of Strings (${node.expression})');
return; return;
@ -162,7 +163,7 @@ class _ViewPropInliner extends RecursiveAstVisitor<Object> {
} }
void _populateTemplateUrl(NamedExpression node) { void _populateTemplateUrl(NamedExpression node) {
var url = _dumbEval(node.expression); var url = dumbEval(node.expression);
if (url is! String) { if (url is! String) {
logger.warning('template url is not a String (${node.expression})'); logger.warning('template url is not a String (${node.expression})');
return; return;
@ -185,15 +186,3 @@ class _ViewPropInliner extends RecursiveAstVisitor<Object> {
}); });
} }
} }
final _constantEvaluator = new ConstantEvaluator();
dynamic _dumbEval(Expression expr) {
var val;
if (expr is SimpleStringLiteral) {
val = stringLiteralToString(expr);
} else {
val = expr.accept(_constantEvaluator);
}
return val != ConstantEvaluator.NOT_A_CONSTANT ? val : null;
}