| // Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| library kernel.text_serializer; |
| |
| import '../ast.dart'; |
| |
| import 'serializer_combinators.dart'; |
| |
| import '../visitor.dart' show ExpressionVisitor; |
| |
| class ExpressionTagger extends ExpressionVisitor<String> { |
| const ExpressionTagger(); |
| |
| String visitStringLiteral(StringLiteral _) => "string"; |
| String visitIntLiteral(IntLiteral _) => "int"; |
| String visitDoubleLiteral(DoubleLiteral _) => "double"; |
| String visitBoolLiteral(BoolLiteral _) => "bool"; |
| String visitNullLiteral(NullLiteral _) => "null"; |
| String visitInvalidExpression(InvalidExpression _) => "invalid"; |
| String visitNot(Not _) => "not"; |
| String visitLogicalExpression(LogicalExpression expression) { |
| return expression.operator; |
| } |
| } |
| |
| TextSerializer<InvalidExpression> invalidExpressionSerializer = new Wrapped( |
| unwrapInvalidExpression, wrapInvalidExpression, const DartString()); |
| |
| String unwrapInvalidExpression(InvalidExpression expression) { |
| return expression.message; |
| } |
| |
| InvalidExpression wrapInvalidExpression(String message) { |
| return new InvalidExpression(message); |
| } |
| |
| TextSerializer<Not> notSerializer = |
| new Wrapped(unwrapNot, wrapNot, expressionSerializer); |
| |
| Expression unwrapNot(Not expression) => expression.operand; |
| |
| Not wrapNot(Expression operand) => new Not(operand); |
| |
| TextSerializer<LogicalExpression> logicalAndSerializer = new Wrapped( |
| unwrapLogicalExpression, |
| wrapLogicalAnd, |
| new Tuple2Serializer(expressionSerializer, expressionSerializer)); |
| |
| Tuple2<Expression, Expression> unwrapLogicalExpression( |
| LogicalExpression expression) { |
| return new Tuple2(expression.left, expression.right); |
| } |
| |
| LogicalExpression wrapLogicalAnd(Tuple2<Expression, Expression> pair) { |
| return new LogicalExpression(pair.first, '&&', pair.second); |
| } |
| |
| TextSerializer<LogicalExpression> logicalOrSerializer = new Wrapped( |
| unwrapLogicalExpression, |
| wrapLogicalOr, |
| new Tuple2Serializer(expressionSerializer, expressionSerializer)); |
| |
| LogicalExpression wrapLogicalOr(Tuple2<Expression, Expression> pair) { |
| return new LogicalExpression(pair.first, '||', pair.second); |
| } |
| |
| TextSerializer<StringLiteral> stringLiteralSerializer = |
| new Wrapped(unwrapStringLiteral, wrapStringLiteral, const DartString()); |
| |
| String unwrapStringLiteral(StringLiteral literal) => literal.value; |
| |
| StringLiteral wrapStringLiteral(String value) => new StringLiteral(value); |
| |
| TextSerializer<IntLiteral> intLiteralSerializer = |
| new Wrapped(unwrapIntLiteral, wrapIntLiteral, const DartInt()); |
| |
| int unwrapIntLiteral(IntLiteral literal) => literal.value; |
| |
| IntLiteral wrapIntLiteral(int value) => new IntLiteral(value); |
| |
| TextSerializer<DoubleLiteral> doubleLiteralSerializer = |
| new Wrapped(unwrapDoubleLiteral, wrapDoubleLiteral, const DartDouble()); |
| |
| double unwrapDoubleLiteral(DoubleLiteral literal) => literal.value; |
| |
| DoubleLiteral wrapDoubleLiteral(double value) => new DoubleLiteral(value); |
| |
| TextSerializer<BoolLiteral> boolLiteralSerializer = |
| new Wrapped(unwrapBoolLiteral, wrapBoolLiteral, const DartBool()); |
| |
| bool unwrapBoolLiteral(BoolLiteral literal) => literal.value; |
| |
| BoolLiteral wrapBoolLiteral(bool value) => new BoolLiteral(value); |
| |
| TextSerializer<NullLiteral> nullLiteralSerializer = |
| new Wrapped(unwrapNullLiteral, wrapNullLiteral, const Nothing()); |
| |
| void unwrapNullLiteral(NullLiteral literal) {} |
| |
| NullLiteral wrapNullLiteral(void ignored) => new NullLiteral(); |
| |
| Case<Expression> expressionSerializer = new Case(); |
| |
| void initializeSerializers() { |
| expressionSerializer.tags.addAll([ |
| "string", |
| "int", |
| "double", |
| "bool", |
| "null", |
| "invalid", |
| "not", |
| "&&", |
| "||", |
| ]); |
| expressionSerializer.serializers.addAll([ |
| stringLiteralSerializer, |
| intLiteralSerializer, |
| doubleLiteralSerializer, |
| boolLiteralSerializer, |
| nullLiteralSerializer, |
| invalidExpressionSerializer, |
| notSerializer, |
| logicalAndSerializer, |
| logicalOrSerializer, |
| ]); |
| } |