Index: pkg/analyzer_experimental/lib/src/generated/constant.dart |
diff --git a/pkg/analyzer_experimental/lib/src/generated/constant.dart b/pkg/analyzer_experimental/lib/src/generated/constant.dart |
deleted file mode 100644 |
index 014d8294b777833d94d2ed547cd4882dbc4f99a8..0000000000000000000000000000000000000000 |
--- a/pkg/analyzer_experimental/lib/src/generated/constant.dart |
+++ /dev/null |
@@ -1,1759 +0,0 @@ |
-// This code was auto-generated, is not intended to be edited, and is subject to |
-// significant change. Please see the README file for more information. |
-library engine.constant; |
-import 'java_core.dart'; |
-import 'source.dart' show Source; |
-import 'error.dart' show AnalysisError, ErrorCode, CompileTimeErrorCode; |
-import 'scanner.dart' show TokenType; |
-import 'ast.dart'; |
-import 'element.dart'; |
-import 'engine.dart' show AnalysisEngine; |
-/** |
- * Instances of the class `ConstantEvaluator` evaluate constant expressions to produce their |
- * compile-time value. According to the Dart Language Specification: <blockquote> A constant |
- * expression is one of the following: |
- * |
- * * A literal number. |
- * * A literal boolean. |
- * * A literal string where any interpolated expression is a compile-time constant that evaluates |
- * to a numeric, string or boolean value or to `null`. |
- * * `null`. |
- * * A reference to a static constant variable. |
- * * An identifier expression that denotes a constant variable, a class or a type parameter. |
- * * A constant constructor invocation. |
- * * A constant list literal. |
- * * A constant map literal. |
- * * A simple or qualified identifier denoting a top-level function or a static method. |
- * * A parenthesized expression `(e)` where `e` is a constant expression. |
- * * An expression of one of the forms `identical(e1, e2)`, `e1 == e2`, |
- * `e1 != e2` where `e1` and `e2` are constant expressions that evaluate to a |
- * numeric, string or boolean value or to `null`. |
- * * An expression of one of the forms `!e`, `e1 && e2` or `e1 || e2`, where |
- * `e`, `e1` and `e2` are constant expressions that evaluate to a boolean value or |
- * to `null`. |
- * * An expression of one of the forms `~e`, `e1 ^ e2`, `e1 & e2`, |
- * `e1 | e2`, `e1 >> e2` or `e1 << e2`, where `e`, `e1` and `e2` |
- * are constant expressions that evaluate to an integer value or to `null`. |
- * * An expression of one of the forms `-e`, `e1 + e2`, `e1 - e2`, |
- * `e1 * e2`, `e1 / e2`, `e1 ~/ e2`, `e1 > e2`, `e1 < e2`, |
- * `e1 >= e2`, `e1 <= e2` or `e1 % e2`, where `e`, `e1` and `e2` |
- * are constant expressions that evaluate to a numeric value or to `null`. |
- * |
- * </blockquote> The values returned by instances of this class are therefore `null` and |
- * instances of the classes `Boolean`, `BigInteger`, `Double`, `String`, and |
- * `DartObject`. |
- * |
- * In addition, this class defines several values that can be returned to indicate various |
- * conditions encountered during evaluation. These are documented with the static field that define |
- * those values. |
- */ |
-class ConstantEvaluator { |
- |
- /** |
- * The source containing the expression(s) that will be evaluated. |
- */ |
- Source _source; |
- |
- /** |
- * Initialize a newly created evaluator to evaluate expressions in the given source. |
- * |
- * @param source the source containing the expression(s) that will be evaluated |
- */ |
- ConstantEvaluator(Source source) { |
- this._source = source; |
- } |
- EvaluationResult evaluate(Expression expression) { |
- EvaluationResultImpl result = expression.accept(new ConstantVisitor()); |
- if (result is ValidResult) { |
- return EvaluationResult.forValue(((result as ValidResult)).value); |
- } |
- List<AnalysisError> errors = new List<AnalysisError>(); |
- for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) { |
- ASTNode node = data.node; |
- errors.add(new AnalysisError.con2(_source, node.offset, node.length, data.errorCode, [])); |
- } |
- return EvaluationResult.forErrors(new List.from(errors)); |
- } |
-} |
-/** |
- * Instances of the class `EvaluationResult` represent the result of attempting to evaluate an |
- * expression. |
- */ |
-class EvaluationResult { |
- |
- /** |
- * Return an evaluation result representing the result of evaluating an expression that is not a |
- * compile-time constant because of the given errors. |
- * |
- * @param errors the errors that should be reported for the expression(s) that were evaluated |
- * @return the result of evaluating an expression that is not a compile-time constant |
- */ |
- static EvaluationResult forErrors(List<AnalysisError> errors) => new EvaluationResult(null, errors); |
- |
- /** |
- * Return an evaluation result representing the result of evaluating an expression that is a |
- * compile-time constant that evaluates to the given value. |
- * |
- * @param value the value of the expression |
- * @return the result of evaluating an expression that is a compile-time constant |
- */ |
- static EvaluationResult forValue(Object value) => new EvaluationResult(value, null); |
- |
- /** |
- * The value of the expression. |
- */ |
- Object value; |
- |
- /** |
- * The errors that should be reported for the expression(s) that were evaluated. |
- */ |
- List<AnalysisError> _errors; |
- |
- /** |
- * Initialize a newly created result object with the given state. Clients should use one of the |
- * factory methods: [forErrors] and [forValue]. |
- * |
- * @param value the value of the expression |
- * @param errors the errors that should be reported for the expression(s) that were evaluated |
- */ |
- EvaluationResult(Object value, List<AnalysisError> errors) { |
- this.value = value; |
- this._errors = errors; |
- } |
- |
- /** |
- * Return an array containing the errors that should be reported for the expression(s) that were |
- * evaluated. If there are no such errors, the array will be empty. The array can be empty even if |
- * the expression is not a valid compile time constant if the errors would have been reported by |
- * other parts of the analysis engine. |
- */ |
- List<AnalysisError> get errors => _errors == null ? AnalysisError.NO_ERRORS : _errors; |
- |
- /** |
- * Return `true` if the expression is a compile-time constant expression that would not |
- * throw an exception when evaluated. |
- * |
- * @return `true` if the expression is a valid compile-time constant expression |
- */ |
- bool get isValid => _errors == null; |
-} |
-/** |
- * Instances of the class `ConstantFinder` are used to traverse the AST structures of all of |
- * the compilation units being resolved and build a table mapping constant variable elements to the |
- * declarations of those variables. |
- */ |
-class ConstantFinder extends RecursiveASTVisitor<Object> { |
- |
- /** |
- * A table mapping constant variable elements to the declarations of those variables. |
- */ |
- final Map<VariableElement, VariableDeclaration> variableMap = new Map<VariableElement, VariableDeclaration>(); |
- Object visitVariableDeclaration(VariableDeclaration node) { |
- super.visitVariableDeclaration(node); |
- Expression initializer = node.initializer; |
- if (initializer != null && node.isConst) { |
- VariableElement element = node.element; |
- if (element != null) { |
- variableMap[element] = node; |
- } |
- } |
- return null; |
- } |
-} |
-/** |
- * Instances of the class `ConstantValueComputer` compute the values of constant variables in |
- * one or more compilation units. The expected usage pattern is for the compilation units to be |
- * added to this computer using the method [add] and then for the method |
- * [computeValues] to invoked exactly once. Any use of an instance after invoking the |
- * method [computeValues] will result in unpredictable behavior. |
- */ |
-class ConstantValueComputer { |
- |
- /** |
- * The object used to find constant variables in the compilation units that were added. |
- */ |
- ConstantFinder _constantFinder = new ConstantFinder(); |
- |
- /** |
- * A graph in which the nodes are the constant variables and the edges are from each variable to |
- * the other constant variables that are referenced in the head's initializer. |
- */ |
- DirectedGraph<VariableElement> _referenceGraph = new DirectedGraph<VariableElement>(); |
- |
- /** |
- * A table mapping constant variables to the declarations of those variables. |
- */ |
- Map<VariableElement, VariableDeclaration> _declarationMap; |
- |
- /** |
- * Add the constant variables in the given compilation unit to the list of constant variables |
- * whose value needs to be computed. |
- * |
- * @param unit the compilation unit defining the constant variables to be added |
- */ |
- void add(CompilationUnit unit) { |
- unit.accept(_constantFinder); |
- } |
- |
- /** |
- * Compute values for all of the constant variables in the compilation units that were added. |
- */ |
- void computeValues() { |
- _declarationMap = _constantFinder.variableMap; |
- for (MapEntry<VariableElement, VariableDeclaration> entry in getMapEntrySet(_declarationMap)) { |
- VariableElement element = entry.getKey(); |
- ReferenceFinder referenceFinder = new ReferenceFinder(element, _referenceGraph); |
- _referenceGraph.addNode(element); |
- entry.getValue().initializer.accept(referenceFinder); |
- } |
- while (!_referenceGraph.isEmpty) { |
- VariableElement element = _referenceGraph.removeSink(); |
- while (element != null) { |
- computeValueFor(element); |
- element = _referenceGraph.removeSink(); |
- } |
- if (!_referenceGraph.isEmpty) { |
- List<VariableElement> variablesInCycle = _referenceGraph.findCycle(); |
- if (variablesInCycle == null) { |
- AnalysisEngine.instance.logger.logError("Exiting constant value computer with ${_referenceGraph.nodeCount} variables that are neither sinks no in a cycle"); |
- return; |
- } |
- for (VariableElement variable in variablesInCycle) { |
- generateCycleError(variablesInCycle, variable); |
- } |
- _referenceGraph.removeAllNodes(variablesInCycle); |
- } |
- } |
- } |
- |
- /** |
- * Compute a value for the given variable. |
- * |
- * @param variable the variable for which a value is to be computed |
- */ |
- void computeValueFor(VariableElement variable) { |
- VariableDeclaration declaration = _declarationMap[variable]; |
- if (declaration == null) { |
- return; |
- } |
- EvaluationResultImpl result = declaration.initializer.accept(new ConstantVisitor()); |
- ((variable as VariableElementImpl)).evaluationResult = result; |
- if (result is ErrorResult) { |
- List<AnalysisError> errors = new List<AnalysisError>(); |
- for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) { |
- ASTNode node = data.node; |
- Source source = variable.getAncestor(CompilationUnitElement).source; |
- errors.add(new AnalysisError.con2(source, node.offset, node.length, data.errorCode, [])); |
- } |
- } |
- } |
- |
- /** |
- * Generate an error indicating that the given variable is not a valid compile-time constant |
- * because it references at least one of the variables in the given cycle, each of which directly |
- * or indirectly references the variable. |
- * |
- * @param variablesInCycle the variables in the cycle that includes the given variable |
- * @param variable the variable that is not a valid compile-time constant |
- */ |
- void generateCycleError(List<VariableElement> variablesInCycle, VariableElement variable) { |
- } |
-} |
-/** |
- * Instances of the class `ConstantVisitor` evaluate constant expressions to produce their |
- * compile-time value. According to the Dart Language Specification: <blockquote> A constant |
- * expression is one of the following: |
- * |
- * * A literal number. |
- * * A literal boolean. |
- * * A literal string where any interpolated expression is a compile-time constant that evaluates |
- * to a numeric, string or boolean value or to `null`. |
- * * `null`. |
- * * A reference to a static constant variable. |
- * * An identifier expression that denotes a constant variable, a class or a type parameter. |
- * * A constant constructor invocation. |
- * * A constant list literal. |
- * * A constant map literal. |
- * * A simple or qualified identifier denoting a top-level function or a static method. |
- * * A parenthesized expression `(e)` where `e` is a constant expression. |
- * * An expression of one of the forms `identical(e1, e2)`, `e1 == e2`, |
- * `e1 != e2` where `e1` and `e2` are constant expressions that evaluate to a |
- * numeric, string or boolean value or to `null`. |
- * * An expression of one of the forms `!e`, `e1 && e2` or `e1 || e2`, where |
- * `e`, `e1` and `e2` are constant expressions that evaluate to a boolean value or |
- * to `null`. |
- * * An expression of one of the forms `~e`, `e1 ^ e2`, `e1 & e2`, |
- * `e1 | e2`, `e1 >> e2` or `e1 << e2`, where `e`, `e1` and `e2` |
- * are constant expressions that evaluate to an integer value or to `null`. |
- * * An expression of one of the forms `-e`, `e1 + e2`, `e1 - e2`, |
- * `e1 * e2`, `e1 / e2`, `e1 ~/ e2`, `e1 > e2`, `e1 < e2`, |
- * `e1 >= e2`, `e1 <= e2` or `e1 % e2`, where `e`, `e1` and `e2` |
- * are constant expressions that evaluate to a numeric value or to `null`. |
- * |
- * </blockquote> |
- */ |
-class ConstantVisitor extends UnifyingASTVisitor<EvaluationResultImpl> { |
- EvaluationResultImpl visitAdjacentStrings(AdjacentStrings node) { |
- EvaluationResultImpl result = null; |
- for (StringLiteral string in node.strings) { |
- if (result == null) { |
- result = string.accept(this); |
- } else { |
- result = result.concatenate(node, string.accept(this)); |
- } |
- } |
- return result; |
- } |
- EvaluationResultImpl visitBinaryExpression(BinaryExpression node) { |
- EvaluationResultImpl leftResult = node.leftOperand.accept(this); |
- EvaluationResultImpl rightResult = node.rightOperand.accept(this); |
- TokenType operatorType = node.operator.type; |
- if (operatorType != TokenType.BANG_EQ && operatorType != TokenType.EQ_EQ) { |
- if (leftResult is ValidResult && ((leftResult as ValidResult)).isNull || rightResult is ValidResult && ((rightResult as ValidResult)).isNull) { |
- return error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION); |
- } |
- } |
- while (true) { |
- if (operatorType == TokenType.AMPERSAND) { |
- return leftResult.bitAnd(node, rightResult); |
- } else if (operatorType == TokenType.AMPERSAND_AMPERSAND) { |
- return leftResult.logicalAnd(node, rightResult); |
- } else if (operatorType == TokenType.BANG_EQ) { |
- return leftResult.notEqual(node, rightResult); |
- } else if (operatorType == TokenType.BAR) { |
- return leftResult.bitOr(node, rightResult); |
- } else if (operatorType == TokenType.BAR_BAR) { |
- return leftResult.logicalOr(node, rightResult); |
- } else if (operatorType == TokenType.CARET) { |
- return leftResult.bitXor(node, rightResult); |
- } else if (operatorType == TokenType.EQ_EQ) { |
- return leftResult.equalEqual(node, rightResult); |
- } else if (operatorType == TokenType.GT) { |
- return leftResult.greaterThan(node, rightResult); |
- } else if (operatorType == TokenType.GT_EQ) { |
- return leftResult.greaterThanOrEqual(node, rightResult); |
- } else if (operatorType == TokenType.GT_GT) { |
- return leftResult.shiftRight(node, rightResult); |
- } else if (operatorType == TokenType.LT) { |
- return leftResult.lessThan(node, rightResult); |
- } else if (operatorType == TokenType.LT_EQ) { |
- return leftResult.lessThanOrEqual(node, rightResult); |
- } else if (operatorType == TokenType.LT_LT) { |
- return leftResult.shiftLeft(node, rightResult); |
- } else if (operatorType == TokenType.MINUS) { |
- return leftResult.minus(node, rightResult); |
- } else if (operatorType == TokenType.PERCENT) { |
- return leftResult.remainder(node, rightResult); |
- } else if (operatorType == TokenType.PLUS) { |
- return leftResult.add(node, rightResult); |
- } else if (operatorType == TokenType.STAR) { |
- return leftResult.times(node, rightResult); |
- } else if (operatorType == TokenType.SLASH) { |
- return leftResult.divide(node, rightResult); |
- } else if (operatorType == TokenType.TILDE_SLASH) { |
- return leftResult.integerDivide(node, rightResult); |
- } |
- break; |
- } |
- return error(node, null); |
- } |
- EvaluationResultImpl visitBooleanLiteral(BooleanLiteral node) => node.value ? ValidResult.RESULT_TRUE : ValidResult.RESULT_FALSE; |
- EvaluationResultImpl visitConditionalExpression(ConditionalExpression node) { |
- Expression condition = node.condition; |
- EvaluationResultImpl conditionResult = condition.accept(this); |
- conditionResult = conditionResult.applyBooleanConversion(condition); |
- if (conditionResult is ErrorResult) { |
- return conditionResult; |
- } |
- EvaluationResultImpl thenResult = node.thenExpression.accept(this); |
- if (thenResult is ErrorResult) { |
- return thenResult; |
- } |
- EvaluationResultImpl elseResult = node.elseExpression.accept(this); |
- if (elseResult is ErrorResult) { |
- return elseResult; |
- } |
- return (identical(conditionResult, ValidResult.RESULT_TRUE)) ? thenResult : elseResult; |
- } |
- EvaluationResultImpl visitDoubleLiteral(DoubleLiteral node) => new ValidResult(node.value); |
- EvaluationResultImpl visitInstanceCreationExpression(InstanceCreationExpression node) { |
- if (!node.isConst) { |
- return error(node, null); |
- } |
- ConstructorElement constructor = node.staticElement; |
- if (constructor != null && constructor.isConst) { |
- node.argumentList.accept(this); |
- return ValidResult.RESULT_OBJECT; |
- } |
- return error(node, null); |
- } |
- EvaluationResultImpl visitIntegerLiteral(IntegerLiteral node) => new ValidResult(node.value); |
- EvaluationResultImpl visitInterpolationExpression(InterpolationExpression node) { |
- EvaluationResultImpl result = node.expression.accept(this); |
- return result.performToString(node); |
- } |
- EvaluationResultImpl visitInterpolationString(InterpolationString node) => new ValidResult(node.value); |
- EvaluationResultImpl visitListLiteral(ListLiteral node) { |
- if (node.constKeyword == null) { |
- return new ErrorResult.con1(node, CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL); |
- } |
- ErrorResult result = null; |
- for (Expression element in node.elements) { |
- result = union(result, element.accept(this)); |
- } |
- if (result != null) { |
- return result; |
- } |
- return ValidResult.RESULT_OBJECT; |
- } |
- EvaluationResultImpl visitMapLiteral(MapLiteral node) { |
- if (node.constKeyword == null) { |
- return new ErrorResult.con1(node, CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL); |
- } |
- ErrorResult result = null; |
- for (MapLiteralEntry entry in node.entries) { |
- result = union(result, entry.key.accept(this)); |
- result = union(result, entry.value.accept(this)); |
- } |
- if (result != null) { |
- return result; |
- } |
- return ValidResult.RESULT_OBJECT; |
- } |
- EvaluationResultImpl visitMethodInvocation(MethodInvocation node) { |
- Element element = node.methodName.staticElement; |
- if (element is FunctionElement) { |
- FunctionElement function = element as FunctionElement; |
- if (function.name == "identical") { |
- NodeList<Expression> arguments = node.argumentList.arguments; |
- if (arguments.length == 2) { |
- Element enclosingElement = function.enclosingElement; |
- if (enclosingElement is CompilationUnitElement) { |
- LibraryElement library = ((enclosingElement as CompilationUnitElement)).library; |
- if (library.isDartCore) { |
- EvaluationResultImpl leftArgument = arguments[0].accept(this); |
- EvaluationResultImpl rightArgument = arguments[1].accept(this); |
- return leftArgument.equalEqual(node, rightArgument); |
- } |
- } |
- } |
- } |
- } |
- return error(node, null); |
- } |
- EvaluationResultImpl visitNamedExpression(NamedExpression node) => node.expression.accept(this); |
- EvaluationResultImpl visitNode(ASTNode node) => error(node, null); |
- EvaluationResultImpl visitNullLiteral(NullLiteral node) => ValidResult.RESULT_NULL; |
- EvaluationResultImpl visitParenthesizedExpression(ParenthesizedExpression node) => node.expression.accept(this); |
- EvaluationResultImpl visitPrefixedIdentifier(PrefixedIdentifier node) { |
- SimpleIdentifier prefixNode = node.prefix; |
- Element prefixElement = prefixNode.staticElement; |
- if (prefixElement is! PrefixElement) { |
- EvaluationResultImpl prefixResult = prefixNode.accept(this); |
- if (prefixResult is! ValidResult) { |
- return error(node, null); |
- } |
- } |
- return getConstantValue(node, node.staticElement); |
- } |
- EvaluationResultImpl visitPrefixExpression(PrefixExpression node) { |
- EvaluationResultImpl operand = node.operand.accept(this); |
- if (operand is ValidResult && ((operand as ValidResult)).isNull) { |
- return error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION); |
- } |
- while (true) { |
- if (node.operator.type == TokenType.BANG) { |
- return operand.logicalNot(node); |
- } else if (node.operator.type == TokenType.TILDE) { |
- return operand.bitNot(node); |
- } else if (node.operator.type == TokenType.MINUS) { |
- return operand.negated(node); |
- } |
- break; |
- } |
- return error(node, null); |
- } |
- EvaluationResultImpl visitPropertyAccess(PropertyAccess node) => getConstantValue(node, node.propertyName.staticElement); |
- EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) => getConstantValue(node, node.staticElement); |
- EvaluationResultImpl visitSimpleStringLiteral(SimpleStringLiteral node) => new ValidResult(node.value); |
- EvaluationResultImpl visitStringInterpolation(StringInterpolation node) { |
- EvaluationResultImpl result = null; |
- for (InterpolationElement element in node.elements) { |
- if (result == null) { |
- result = element.accept(this); |
- } else { |
- result = result.concatenate(node, element.accept(this)); |
- } |
- } |
- return result; |
- } |
- EvaluationResultImpl visitSymbolLiteral(SymbolLiteral node) => ValidResult.RESULT_SYMBOL; |
- |
- /** |
- * Return a result object representing an error associated with the given node. |
- * |
- * @param node the AST node associated with the error |
- * @param code the error code indicating the nature of the error |
- * @return a result object representing an error associated with the given node |
- */ |
- ErrorResult error(ASTNode node, ErrorCode code) => new ErrorResult.con1(node, code == null ? CompileTimeErrorCode.INVALID_CONSTANT : code); |
- |
- /** |
- * Return the constant value of the static constant represented by the given element. |
- * |
- * @param node the node to be used if an error needs to be reported |
- * @param element the element whose value is to be returned |
- * @return the constant value of the static constant |
- */ |
- EvaluationResultImpl getConstantValue(ASTNode node, Element element) { |
- if (element is PropertyAccessorElement) { |
- element = ((element as PropertyAccessorElement)).variable; |
- } |
- if (element is VariableElementImpl) { |
- VariableElementImpl variableElementImpl = element as VariableElementImpl; |
- EvaluationResultImpl value = variableElementImpl.evaluationResult; |
- if (variableElementImpl.isConst && value != null) { |
- return value; |
- } |
- } else if (element is ExecutableElement) { |
- if (((element as ExecutableElement)).isStatic) { |
- return new ValidResult(element); |
- } |
- } else if (element is ClassElement) { |
- return ValidResult.RESULT_OBJECT; |
- } |
- return error(node, null); |
- } |
- |
- /** |
- * Return the union of the errors encoded in the given results. |
- * |
- * @param leftResult the first set of errors, or `null` if there was no previous collection |
- * of errors |
- * @param rightResult the errors to be added to the collection, or a valid result if there are no |
- * errors to be added |
- * @return the union of the errors encoded in the given results |
- */ |
- ErrorResult union(ErrorResult leftResult, EvaluationResultImpl rightResult) { |
- if (rightResult is ErrorResult) { |
- if (leftResult != null) { |
- return new ErrorResult.con2(leftResult, rightResult as ErrorResult); |
- } else { |
- return rightResult as ErrorResult; |
- } |
- } |
- return leftResult; |
- } |
-} |
-/** |
- * Instances of the class `DirectedGraph` implement a directed graph in which the nodes are |
- * arbitrary (client provided) objects and edges are represented implicitly. The graph will allow an |
- * edge from any node to any other node, including itself, but will not represent multiple edges |
- * between the same pair of nodes. |
- * |
- * @param N the type of the nodes in the graph |
- */ |
-class DirectedGraph<N> { |
- |
- /** |
- * The table encoding the edges in the graph. An edge is represented by an entry mapping the head |
- * to a set of tails. Nodes that are not the head of any edge are represented by an entry mapping |
- * the node to an empty set of tails. |
- */ |
- Map<N, Set<N>> _edges = new Map<N, Set<N>>(); |
- |
- /** |
- * Add an edge from the given head node to the given tail node. Both nodes will be a part of the |
- * graph after this method is invoked, whether or not they were before. |
- * |
- * @param head the node at the head of the edge |
- * @param tail the node at the tail of the edge |
- */ |
- void addEdge(N head, N tail) { |
- Set<N> tails = _edges[tail]; |
- if (tails == null) { |
- _edges[tail] = new Set<N>(); |
- } |
- tails = _edges[head]; |
- if (tails == null) { |
- tails = new Set<N>(); |
- _edges[head] = tails; |
- } |
- javaSetAdd(tails, tail); |
- } |
- |
- /** |
- * Add the given node to the set of nodes in the graph. |
- * |
- * @param node the node to be added |
- */ |
- void addNode(N node) { |
- Set<N> tails = _edges[node]; |
- if (tails == null) { |
- _edges[node] = new Set<N>(); |
- } |
- } |
- |
- /** |
- * Return a list of nodes that form a cycle, or `null` if there are no cycles in this graph. |
- * |
- * @return a list of nodes that form a cycle |
- */ |
- List<N> findCycle() => null; |
- |
- /** |
- * Return the number of nodes in this graph. |
- * |
- * @return the number of nodes in this graph |
- */ |
- int get nodeCount => _edges.length; |
- |
- /** |
- * Return a set containing the tails of edges that have the given node as their head. The set will |
- * be empty if there are no such edges or if the node is not part of the graph. Clients must not |
- * modify the returned set. |
- * |
- * @param head the node at the head of all of the edges whose tails are to be returned |
- * @return a set containing the tails of edges that have the given node as their head |
- */ |
- Set<N> getTails(N head) { |
- Set<N> tails = _edges[head]; |
- if (tails == null) { |
- return new Set<N>(); |
- } |
- return tails; |
- } |
- |
- /** |
- * Return `true` if this graph is empty. |
- * |
- * @return `true` if this graph is empty |
- */ |
- bool get isEmpty => _edges.isEmpty; |
- |
- /** |
- * Remove all of the given nodes from this graph. As a consequence, any edges for which those |
- * nodes were either a head or a tail will also be removed. |
- * |
- * @param nodes the nodes to be removed |
- */ |
- void removeAllNodes(List<N> nodes) { |
- for (N node in nodes) { |
- removeNode(node); |
- } |
- } |
- |
- /** |
- * Remove the edge from the given head node to the given tail node. If there was no such edge then |
- * the graph will be unmodified: the number of edges will be the same and the set of nodes will be |
- * the same (neither node will either be added or removed). |
- * |
- * @param head the node at the head of the edge |
- * @param tail the node at the tail of the edge |
- * @return `true` if the graph was modified as a result of this operation |
- */ |
- void removeEdge(N head, N tail) { |
- Set<N> tails = _edges[head]; |
- if (tails != null) { |
- tails.remove(tail); |
- } |
- } |
- |
- /** |
- * Remove the given node from this graph. As a consequence, any edges for which that node was |
- * either a head or a tail will also be removed. |
- * |
- * @param node the node to be removed |
- */ |
- void removeNode(N node) { |
- _edges.remove(node); |
- for (Set<N> tails in _edges.values) { |
- tails.remove(node); |
- } |
- } |
- |
- /** |
- * Find one node (referred to as a sink node) that has no outgoing edges (that is, for which there |
- * are no edges that have that node as the head of the edge) and remove it from this graph. Return |
- * the node that was removed, or `null` if there are no such nodes either because the graph |
- * is empty or because every node in the graph has at least one outgoing edge. As a consequence of |
- * removing the node from the graph any edges for which that node was a tail will also be removed. |
- * |
- * @return the sink node that was removed |
- */ |
- N removeSink() { |
- N sink = findSink(); |
- if (sink == null) { |
- return null; |
- } |
- removeNode(sink); |
- return sink; |
- } |
- |
- /** |
- * Return one node that has no outgoing edges (that is, for which there are no edges that have |
- * that node as the head of the edge), or `null` if there are no such nodes. |
- * |
- * @return a sink node |
- */ |
- N findSink() { |
- for (N key in _edges.keys) { |
- if (_edges[key].isEmpty) return key; |
- } |
- return null; |
- } |
-} |
-/** |
- * Instances of the class `ErrorResult` represent the result of evaluating an expression that |
- * is not a valid compile time constant. |
- */ |
-class ErrorResult extends EvaluationResultImpl { |
- |
- /** |
- * The errors that prevent the expression from being a valid compile time constant. |
- */ |
- final List<ErrorResult_ErrorData> errorData = new List<ErrorResult_ErrorData>(); |
- |
- /** |
- * Initialize a newly created result representing the error with the given code reported against |
- * the given node. |
- * |
- * @param node the node against which the error should be reported |
- * @param errorCode the error code for the error to be generated |
- */ |
- ErrorResult.con1(ASTNode node, ErrorCode errorCode) { |
- errorData.add(new ErrorResult_ErrorData(node, errorCode)); |
- } |
- |
- /** |
- * Initialize a newly created result to represent the union of the errors in the given result |
- * objects. |
- * |
- * @param firstResult the first set of results being merged |
- * @param secondResult the second set of results being merged |
- */ |
- ErrorResult.con2(ErrorResult firstResult, ErrorResult secondResult) { |
- errorData.addAll(firstResult.errorData); |
- errorData.addAll(secondResult.errorData); |
- } |
- EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToError(node, this); |
- EvaluationResultImpl applyBooleanConversion(ASTNode node) => this; |
- EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitAndError(node, this); |
- EvaluationResultImpl bitNot(Expression node) => this; |
- EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitOrError(node, this); |
- EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitXorError(node, this); |
- EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateError(node, this); |
- EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideError(node, this); |
- EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualError(node, this); |
- bool equalValues(EvaluationResultImpl result) => false; |
- EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanError(node, this); |
- EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualError(node, this); |
- EvaluationResultImpl integerDivide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideError(node, this); |
- EvaluationResultImpl integerDivideValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl lessThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanError(node, this); |
- EvaluationResultImpl lessThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanOrEqualError(node, this); |
- EvaluationResultImpl logicalAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalAndError(node, this); |
- EvaluationResultImpl logicalNot(Expression node) => this; |
- EvaluationResultImpl logicalOr(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalOrError(node, this); |
- EvaluationResultImpl minus(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.minusError(node, this); |
- EvaluationResultImpl negated(Expression node) => this; |
- EvaluationResultImpl notEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.notEqualError(node, this); |
- EvaluationResultImpl performToString(ASTNode node) => this; |
- EvaluationResultImpl remainder(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.remainderError(node, this); |
- EvaluationResultImpl shiftLeft(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftLeftError(node, this); |
- EvaluationResultImpl shiftRight(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftRightError(node, this); |
- EvaluationResultImpl times(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.timesError(node, this); |
- EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl addToValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl bitAndValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl bitOrValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl bitXorValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl concatenateValid(Expression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl divideValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl equalEqualValid(Expression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl greaterThanOrEqualValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl greaterThanValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl lessThanOrEqualValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl lessThanValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl logicalAndValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl logicalOrValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl minusValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOperand) => this; |
- EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand); |
- EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand) => this; |
-} |
-class ErrorResult_ErrorData { |
- |
- /** |
- * The node against which the error should be reported. |
- */ |
- ASTNode node; |
- |
- /** |
- * The error code for the error to be generated. |
- */ |
- ErrorCode errorCode; |
- |
- /** |
- * Initialize a newly created data holder to represent the error with the given code reported |
- * against the given node. |
- * |
- * @param node the node against which the error should be reported |
- * @param errorCode the error code for the error to be generated |
- */ |
- ErrorResult_ErrorData(ASTNode node, ErrorCode errorCode) { |
- this.node = node; |
- this.errorCode = errorCode; |
- } |
-} |
-/** |
- * Instances of the class `InternalResult` represent the result of attempting to evaluate a |
- * expression. |
- */ |
-abstract class EvaluationResultImpl { |
- EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOperand); |
- |
- /** |
- * Return the result of applying boolean conversion to this result. |
- * |
- * @param node the node against which errors should be reported |
- * @return the result of applying boolean conversion to the given value |
- */ |
- EvaluationResultImpl applyBooleanConversion(ASTNode node); |
- EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl bitNot(Expression node); |
- EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOperand); |
- bool equalValues(EvaluationResultImpl result); |
- EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl integerDivide(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl lessThan(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl lessThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl logicalAnd(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl logicalNot(Expression node); |
- EvaluationResultImpl logicalOr(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl minus(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl negated(Expression node); |
- EvaluationResultImpl notEqual(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl performToString(ASTNode node); |
- EvaluationResultImpl remainder(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl shiftLeft(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl shiftRight(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl times(BinaryExpression node, EvaluationResultImpl rightOperand); |
- EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl addToValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl bitAndValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl bitOrValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl bitXorValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand); |
- EvaluationResultImpl concatenateValid(Expression node, ValidResult leftOperand); |
- EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl divideValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand); |
- EvaluationResultImpl equalEqualValid(Expression node, ValidResult leftOperand); |
- EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl greaterThanOrEqualValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl greaterThanValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl integerDivideValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl lessThanOrEqualValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl lessThanValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl logicalAndValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl logicalOrValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl minusValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOperand); |
- EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand); |
- EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand); |
-} |
-/** |
- * Instances of the class `ReferenceFinder` add reference information for a given variable to |
- * the bi-directional mapping used to order the evaluation of constants. |
- */ |
-class ReferenceFinder extends RecursiveASTVisitor<Object> { |
- |
- /** |
- * The element representing the variable whose initializer will be visited. |
- */ |
- VariableElement _source; |
- |
- /** |
- * A graph in which the nodes are the constant variables and the edges are from each variable to |
- * the other constant variables that are referenced in the head's initializer. |
- */ |
- DirectedGraph<VariableElement> _referenceGraph; |
- |
- /** |
- * Initialize a newly created reference finder to find references from the given variable to other |
- * variables and to add those references to the given graph. |
- * |
- * @param source the element representing the variable whose initializer will be visited |
- * @param referenceGraph a graph recording which variables (heads) reference which other variables |
- * (tails) in their initializers |
- */ |
- ReferenceFinder(VariableElement source, DirectedGraph<VariableElement> referenceGraph) { |
- this._source = source; |
- this._referenceGraph = referenceGraph; |
- } |
- Object visitSimpleIdentifier(SimpleIdentifier node) { |
- Element element = node.staticElement; |
- if (element is PropertyAccessorElement) { |
- element = ((element as PropertyAccessorElement)).variable; |
- } |
- if (element is VariableElement) { |
- VariableElement variable = element as VariableElement; |
- if (variable.isConst) { |
- _referenceGraph.addEdge(_source, variable); |
- } |
- } |
- return null; |
- } |
-} |
-/** |
- * Instances of the class `ValidResult` represent the result of attempting to evaluate a valid |
- * compile time constant expression. |
- */ |
-class ValidResult extends EvaluationResultImpl { |
- |
- /** |
- * A result object representing the value 'false'. |
- */ |
- static ValidResult RESULT_FALSE = new ValidResult(false); |
- |
- /** |
- * A result object representing the an object without specific type on which no further operations |
- * can be performed. |
- */ |
- static ValidResult RESULT_DYNAMIC = new ValidResult(null); |
- |
- /** |
- * A result object representing the an arbitrary integer on which no further operations can be |
- * performed. |
- */ |
- static ValidResult RESULT_INT = new ValidResult(0); |
- |
- /** |
- * A result object representing the `null` value. |
- */ |
- static ValidResult RESULT_NULL = new ValidResult(null); |
- |
- /** |
- * A result object representing the an arbitrary numeric on which no further operations can be |
- * performed. |
- */ |
- static ValidResult RESULT_NUM = new ValidResult(null); |
- |
- /** |
- * A result object representing the an arbitrary boolean on which no further operations can be |
- * performed. |
- */ |
- static ValidResult RESULT_BOOL = new ValidResult(null); |
- |
- /** |
- * A result object representing the an arbitrary object on which no further operations can be |
- * performed. |
- */ |
- static ValidResult RESULT_OBJECT = new ValidResult(new Object()); |
- |
- /** |
- * A result object representing the an arbitrary symbol on which no further operations can be |
- * performed. |
- */ |
- static ValidResult RESULT_SYMBOL = new ValidResult(new Object()); |
- |
- /** |
- * A result object representing the an arbitrary string on which no further operations can be |
- * performed. |
- */ |
- static ValidResult RESULT_STRING = new ValidResult("<string>"); |
- |
- /** |
- * A result object representing the value 'true'. |
- */ |
- static ValidResult RESULT_TRUE = new ValidResult(true); |
- |
- /** |
- * The value of the expression. |
- */ |
- Object value; |
- |
- /** |
- * Initialize a newly created result to represent the given value. |
- * |
- * @param value the value of the expression |
- */ |
- ValidResult(Object value) { |
- this.value = value; |
- } |
- EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToValid(node, this); |
- |
- /** |
- * Return the result of applying boolean conversion to this result. |
- * |
- * @param node the node against which errors should be reported |
- * @return the result of applying boolean conversion to the given value |
- */ |
- EvaluationResultImpl applyBooleanConversion(ASTNode node) => booleanConversion(node, value); |
- EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitAndValid(node, this); |
- EvaluationResultImpl bitNot(Expression node) { |
- if (isSomeInt) { |
- return RESULT_INT; |
- } |
- if (value == null) { |
- return error(node); |
- } else if (value is int) { |
- return valueOf(~((value as int))); |
- } |
- return error(node); |
- } |
- EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitOrValid(node, this); |
- EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitXorValid(node, this); |
- EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateValid(node, this); |
- EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideValid(node, this); |
- EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualValid(node, this); |
- bool equalValues(EvaluationResultImpl result) => identical(equalEqual(null, result), RESULT_TRUE); |
- EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanValid(node, this); |
- EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualValid(node, this); |
- EvaluationResultImpl integerDivide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideValid(node, this); |
- EvaluationResultImpl lessThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanValid(node, this); |
- EvaluationResultImpl lessThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanOrEqualValid(node, this); |
- EvaluationResultImpl logicalAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalAndValid(node, this); |
- EvaluationResultImpl logicalNot(Expression node) { |
- if (isSomeBool) { |
- return RESULT_BOOL; |
- } |
- if (value == null) { |
- return RESULT_TRUE; |
- } else if (value is bool) { |
- return ((value as bool)) ? RESULT_FALSE : RESULT_TRUE; |
- } |
- return error(node); |
- } |
- EvaluationResultImpl logicalOr(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalOrValid(node, this); |
- EvaluationResultImpl minus(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.minusValid(node, this); |
- EvaluationResultImpl negated(Expression node) { |
- if (isSomeNum) { |
- return RESULT_INT; |
- } |
- if (value == null) { |
- return error(node); |
- } else if (value is int) { |
- return valueOf(-((value as int))); |
- } else if (value is double) { |
- return valueOf3(-((value as double))); |
- } |
- return error(node); |
- } |
- EvaluationResultImpl notEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.notEqualValid(node, this); |
- EvaluationResultImpl performToString(ASTNode node) { |
- if (value == null) { |
- return valueOf4("null"); |
- } else if (value is bool) { |
- return valueOf4(((value as bool)).toString()); |
- } else if (value is int) { |
- return valueOf4(((value as int)).toString()); |
- } else if (value is double) { |
- return valueOf4(((value as double)).toString()); |
- } else if (value is String) { |
- return this; |
- } else if (isSomeBool) { |
- return valueOf4("<some bool>"); |
- } else if (isSomeInt) { |
- return valueOf4("<some int>"); |
- } else if (isSomeNum) { |
- return valueOf4("<some num>"); |
- } |
- return error(node); |
- } |
- EvaluationResultImpl remainder(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.remainderValid(node, this); |
- EvaluationResultImpl shiftLeft(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftLeftValid(node, this); |
- EvaluationResultImpl shiftRight(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftRightValid(node, this); |
- EvaluationResultImpl times(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.timesValid(node, this); |
- String toString() { |
- if (value == null) { |
- return "null"; |
- } |
- return value.toString(); |
- } |
- EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl addToValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyNum || !leftOperand.isAnyNum) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM); |
- } |
- if (isSomeInt || leftOperand.isSomeInt) { |
- return RESULT_INT; |
- } else if (isSomeNum || leftOperand.isSomeNum) { |
- return RESULT_NUM; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- return valueOf(((leftValue as int)) + (value as int)); |
- } else if (value is double) { |
- return valueOf3(((leftValue as int)).toDouble() + ((value as double))); |
- } |
- } else if (leftValue is double) { |
- if (value is int) { |
- return valueOf3(((leftValue as double)) + ((value as int)).toDouble()); |
- } else if (value is double) { |
- return valueOf3(((leftValue as double)) + ((value as double))); |
- } |
- } else if (leftValue is String) { |
- if (value is String) { |
- return valueOf4("${((leftValue as String))}${((value as String))}"); |
- } |
- } |
- return error(node); |
- } |
- EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl bitAndValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyInt || !leftOperand.isAnyInt) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT); |
- } |
- if (isSomeInt || leftOperand.isSomeInt) { |
- return RESULT_INT; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- return valueOf(((leftValue as int)) & (value as int)); |
- } |
- return error(node.leftOperand); |
- } |
- if (value is int) { |
- return error(node.rightOperand); |
- } |
- return union(error(node.leftOperand), error(node.rightOperand)); |
- } |
- EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl bitOrValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyInt || !leftOperand.isAnyInt) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT); |
- } |
- if (isSomeInt || leftOperand.isSomeInt) { |
- return RESULT_INT; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- return valueOf(((leftValue as int)) | (value as int)); |
- } |
- return error(node.leftOperand); |
- } |
- if (value is int) { |
- return error(node.rightOperand); |
- } |
- return union(error(node.leftOperand), error(node.rightOperand)); |
- } |
- EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl bitXorValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyInt || !leftOperand.isAnyInt) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT); |
- } |
- if (isSomeInt || leftOperand.isSomeInt) { |
- return RESULT_INT; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- return valueOf(((leftValue as int)) ^ (value as int)); |
- } |
- return error(node.leftOperand); |
- } |
- if (value is int) { |
- return error(node.rightOperand); |
- } |
- return union(error(node.leftOperand), error(node.rightOperand)); |
- } |
- EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl concatenateValid(Expression node, ValidResult leftOperand) { |
- Object leftValue = leftOperand.value; |
- if (leftValue is String && value is String) { |
- return valueOf4("${((leftValue as String))}${((value as String))}"); |
- } |
- return error(node); |
- } |
- EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl divideValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyNum || !leftOperand.isAnyNum) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM); |
- } |
- if (isSomeNum || leftOperand.isSomeNum) { |
- return RESULT_NUM; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- if (((value as int)) == 0) { |
- return valueOf3(((leftValue as int)).toDouble() / ((value as int)).toDouble()); |
- } |
- return valueOf(((leftValue as int)) ~/ (value as int)); |
- } else if (value is double) { |
- return valueOf3(((leftValue as int)).toDouble() / ((value as double))); |
- } |
- } else if (leftValue is double) { |
- if (value is int) { |
- return valueOf3(((leftValue as double)) / ((value as int)).toDouble()); |
- } else if (value is double) { |
- return valueOf3(((leftValue as double)) / ((value as double))); |
- } |
- } |
- return error(node); |
- } |
- EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl equalEqualValid(Expression node, ValidResult leftOperand) { |
- if (node is BinaryExpression) { |
- if (!isAnyNullBoolNumString || !leftOperand.isAnyNullBoolNumString) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING); |
- } |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return valueOf2(value == null); |
- } else if (leftValue is bool) { |
- if (value is bool) { |
- return valueOf2(identical(leftValue as bool, value as bool)); |
- } |
- return RESULT_FALSE; |
- } else if (leftValue is int) { |
- if (value is int) { |
- return valueOf2(((leftValue as int)) == value); |
- } else if (value is double) { |
- return valueOf2(toDouble(leftValue as int) == value); |
- } |
- return RESULT_FALSE; |
- } else if (leftValue is double) { |
- if (value is int) { |
- return valueOf2(((leftValue as double)) == toDouble(value as int)); |
- } else if (value is double) { |
- return valueOf2(((leftValue as double)) == value); |
- } |
- return RESULT_FALSE; |
- } else if (leftValue is String) { |
- if (value is String) { |
- return valueOf2(((leftValue as String)) == value); |
- } |
- return RESULT_FALSE; |
- } |
- return RESULT_FALSE; |
- } |
- EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl greaterThanOrEqualValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyNum || !leftOperand.isAnyNum) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM); |
- } |
- if (isSomeNum || leftOperand.isSomeNum) { |
- return RESULT_BOOL; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- return valueOf2(((leftValue as int)).compareTo(value as int) >= 0); |
- } else if (value is double) { |
- return valueOf2(((leftValue as int)).toDouble() >= ((value as double))); |
- } |
- } else if (leftValue is double) { |
- if (value is int) { |
- return valueOf2(((leftValue as double)) >= ((value as int)).toDouble()); |
- } else if (value is double) { |
- return valueOf2(((leftValue as double)) >= ((value as double))); |
- } |
- } |
- return error(node); |
- } |
- EvaluationResultImpl greaterThanValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyNum || !leftOperand.isAnyNum) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM); |
- } |
- if (isSomeNum || leftOperand.isSomeNum) { |
- return RESULT_BOOL; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- return valueOf2(((leftValue as int)).compareTo(value as int) > 0); |
- } else if (value is double) { |
- return valueOf2(((leftValue as int)).toDouble() > ((value as double))); |
- } |
- } else if (leftValue is double) { |
- if (value is int) { |
- return valueOf2(((leftValue as double)) > ((value as int)).toDouble()); |
- } else if (value is double) { |
- return valueOf2(((leftValue as double)) > ((value as double))); |
- } |
- } |
- return error(node); |
- } |
- EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl integerDivideValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyNum || !leftOperand.isAnyNum) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM); |
- } |
- if (isSomeNum || leftOperand.isSomeNum) { |
- return RESULT_INT; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- if (((value as int)) == 0) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE); |
- } |
- return valueOf(((leftValue as int)) ~/ (value as int)); |
- } else if (value is double) { |
- double result = ((leftValue as int)).toDouble() / ((value as double)); |
- return valueOf(result.toInt()); |
- } |
- } else if (leftValue is double) { |
- if (value is int) { |
- double result = ((leftValue as double)) / ((value as int)).toDouble(); |
- return valueOf(result.toInt()); |
- } else if (value is double) { |
- double result = ((leftValue as double)) / ((value as double)); |
- return valueOf(result.toInt()); |
- } |
- } |
- return error(node); |
- } |
- EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl lessThanOrEqualValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyNum || !leftOperand.isAnyNum) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM); |
- } |
- if (isSomeNum || leftOperand.isSomeNum) { |
- return RESULT_BOOL; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- return valueOf2(((leftValue as int)).compareTo(value as int) <= 0); |
- } else if (value is double) { |
- return valueOf2(((leftValue as int)).toDouble() <= ((value as double))); |
- } |
- } else if (leftValue is double) { |
- if (value is int) { |
- return valueOf2(((leftValue as double)) <= ((value as int)).toDouble()); |
- } else if (value is double) { |
- return valueOf2(((leftValue as double)) <= ((value as double))); |
- } |
- } |
- return error(node); |
- } |
- EvaluationResultImpl lessThanValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyNum || !leftOperand.isAnyNum) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM); |
- } |
- if (isSomeNum || leftOperand.isSomeNum) { |
- return RESULT_BOOL; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- return valueOf2(((leftValue as int)).compareTo(value as int) < 0); |
- } else if (value is double) { |
- return valueOf2(((leftValue as int)).toDouble() < ((value as double))); |
- } |
- } else if (leftValue is double) { |
- if (value is int) { |
- return valueOf2(((leftValue as double)) < ((value as int)).toDouble()); |
- } else if (value is double) { |
- return valueOf2(((leftValue as double)) < ((value as double))); |
- } |
- } |
- return error(node); |
- } |
- EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl logicalAndValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyBool || !leftOperand.isAnyBool) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL); |
- } |
- if (isSomeBool || leftOperand.isSomeBool) { |
- return RESULT_BOOL; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue is bool) { |
- if (leftValue as bool) { |
- return booleanConversion(node.rightOperand, value); |
- } |
- return RESULT_FALSE; |
- } |
- return error(node); |
- } |
- EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl logicalOrValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyBool || !leftOperand.isAnyBool) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL); |
- } |
- if (isSomeBool || leftOperand.isSomeBool) { |
- return RESULT_BOOL; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue is bool && ((leftValue as bool))) { |
- return RESULT_TRUE; |
- } |
- return booleanConversion(node.rightOperand, value); |
- } |
- EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl minusValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyNum || !leftOperand.isAnyNum) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM); |
- } |
- if (isSomeInt || leftOperand.isSomeInt) { |
- return RESULT_INT; |
- } else if (isSomeNum || leftOperand.isSomeNum) { |
- return RESULT_NUM; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- return valueOf(((leftValue as int)) - (value as int)); |
- } else if (value is double) { |
- return valueOf3(((leftValue as int)).toDouble() - ((value as double))); |
- } |
- } else if (leftValue is double) { |
- if (value is int) { |
- return valueOf3(((leftValue as double)) - ((value as int)).toDouble()); |
- } else if (value is double) { |
- return valueOf3(((leftValue as double)) - ((value as double))); |
- } |
- } |
- return error(node); |
- } |
- EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyNullBoolNumString || !leftOperand.isAnyNullBoolNumString) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING); |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return valueOf2(value != null); |
- } else if (leftValue is bool) { |
- if (value is bool) { |
- return valueOf2(((leftValue as bool)) != ((value as bool))); |
- } |
- return RESULT_TRUE; |
- } else if (leftValue is int) { |
- if (value is int) { |
- return valueOf2(((leftValue as int)) != value); |
- } else if (value is double) { |
- return valueOf2(toDouble(leftValue as int) != value); |
- } |
- return RESULT_TRUE; |
- } else if (leftValue is double) { |
- if (value is int) { |
- return valueOf2(((leftValue as double)) != toDouble(value as int)); |
- } else if (value is double) { |
- return valueOf2(((leftValue as double)) != value); |
- } |
- return RESULT_TRUE; |
- } else if (leftValue is String) { |
- if (value is String) { |
- return valueOf2(((leftValue as String)) != value); |
- } |
- return RESULT_TRUE; |
- } |
- return RESULT_TRUE; |
- } |
- EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyNum || !leftOperand.isAnyNum) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM); |
- } |
- if (isSomeInt || leftOperand.isSomeInt) { |
- return RESULT_INT; |
- } else if (isSomeNum || leftOperand.isSomeNum) { |
- return RESULT_NUM; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- if (((value as int)) == 0) { |
- return valueOf3(((leftValue as int)).toDouble() % ((value as int)).toDouble()); |
- } |
- return valueOf(((leftValue as int)).remainder(value as int)); |
- } else if (value is double) { |
- return valueOf3(((leftValue as int)).toDouble() % ((value as double))); |
- } |
- } else if (leftValue is double) { |
- if (value is int) { |
- return valueOf3(((leftValue as double)) % ((value as int)).toDouble()); |
- } else if (value is double) { |
- return valueOf3(((leftValue as double)) % ((value as double))); |
- } |
- } |
- return error(node); |
- } |
- EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyInt || !leftOperand.isAnyInt) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT); |
- } |
- if (isSomeInt || leftOperand.isSomeInt) { |
- return RESULT_INT; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- return RESULT_INT; |
- } |
- return error(node.rightOperand); |
- } |
- if (value is int) { |
- return error(node.leftOperand); |
- } |
- return union(error(node.leftOperand), error(node.rightOperand)); |
- } |
- EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyInt || !leftOperand.isAnyInt) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT); |
- } |
- if (isSomeInt || leftOperand.isSomeInt) { |
- return RESULT_INT; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- return valueOf(((leftValue as int)) >> ((value as int))); |
- } |
- return error(node.rightOperand); |
- } |
- if (value is int) { |
- return error(node.leftOperand); |
- } |
- return union(error(node.leftOperand), error(node.rightOperand)); |
- } |
- EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => leftOperand; |
- EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand) { |
- if (!isAnyNum || !leftOperand.isAnyNum) { |
- return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM); |
- } |
- if (isSomeInt || leftOperand.isSomeInt) { |
- return RESULT_INT; |
- } else if (isSomeNum || leftOperand.isSomeNum) { |
- return RESULT_NUM; |
- } |
- Object leftValue = leftOperand.value; |
- if (leftValue == null) { |
- return error(node.leftOperand); |
- } else if (value == null) { |
- return error(node.rightOperand); |
- } else if (leftValue is int) { |
- if (value is int) { |
- return valueOf(((leftValue as int)) * (value as int)); |
- } else if (value is double) { |
- return valueOf3(((leftValue as int)).toDouble() * ((value as double))); |
- } |
- } else if (leftValue is double) { |
- if (value is int) { |
- return valueOf3(((leftValue as double)) * ((value as int)).toDouble()); |
- } else if (value is double) { |
- return valueOf3(((leftValue as double)) * ((value as double))); |
- } |
- } |
- return error(node); |
- } |
- bool get isNull => identical(this, RESULT_NULL); |
- |
- /** |
- * Return the result of applying boolean conversion to the given value. |
- * |
- * @param node the node against which errors should be reported |
- * @param value the value to be converted to a boolean |
- * @return the result of applying boolean conversion to the given value |
- */ |
- EvaluationResultImpl booleanConversion(ASTNode node, Object value) { |
- if (value is bool) { |
- if (value as bool) { |
- return RESULT_TRUE; |
- } else { |
- return RESULT_FALSE; |
- } |
- } |
- return error(node); |
- } |
- ErrorResult error(ASTNode node) => error2(node, CompileTimeErrorCode.INVALID_CONSTANT); |
- |
- /** |
- * Return a result object representing an error associated with the given node. |
- * |
- * @param node the AST node associated with the error |
- * @param code the error code indicating the nature of the error |
- * @return a result object representing an error associated with the given node |
- */ |
- ErrorResult error2(ASTNode node, ErrorCode code) => new ErrorResult.con1(node, code); |
- |
- /** |
- * Checks if this result has type "bool", with known or unknown value. |
- */ |
- bool get isAnyBool => isSomeBool || identical(this, RESULT_TRUE) || identical(this, RESULT_FALSE); |
- |
- /** |
- * Checks if this result has type "int", with known or unknown value. |
- */ |
- bool get isAnyInt => identical(this, RESULT_INT) || value is int; |
- |
- /** |
- * Checks if this result has one of the types - "bool", "num" or "string"; or may be `null`. |
- */ |
- bool get isAnyNullBoolNumString => isNull || isAnyBool || isAnyNum || value is String; |
- |
- /** |
- * Checks if this result has type "num", with known or unknown value. |
- */ |
- bool get isAnyNum => isSomeNum || value is num; |
- |
- /** |
- * Checks if this result has type "bool", exact value of which we don't know. |
- */ |
- bool get isSomeBool => identical(this, RESULT_BOOL); |
- |
- /** |
- * Checks if this result has type "int", exact value of which we don't know. |
- */ |
- bool get isSomeInt => identical(this, RESULT_INT); |
- |
- /** |
- * Checks if this result has type "num" (or "int"), exact value of which we don't know. |
- */ |
- bool get isSomeNum => identical(this, RESULT_DYNAMIC) || identical(this, RESULT_INT) || identical(this, RESULT_NUM); |
- double toDouble(int value) => value.toDouble(); |
- |
- /** |
- * Return an error result that is the union of the two given error results. |
- * |
- * @param firstError the first error to be combined |
- * @param secondError the second error to be combined |
- * @return an error result that is the union of the two given error results |
- */ |
- ErrorResult union(ErrorResult firstError, ErrorResult secondError) => new ErrorResult.con2(firstError, secondError); |
- |
- /** |
- * Return a result object representing the given value. |
- * |
- * @param value the value to be represented as a result object |
- * @return a result object representing the given value |
- */ |
- ValidResult valueOf(int value) => new ValidResult(value); |
- |
- /** |
- * Return a result object representing the given value. |
- * |
- * @param value the value to be represented as a result object |
- * @return a result object representing the given value |
- */ |
- ValidResult valueOf2(bool value) => value ? RESULT_TRUE : RESULT_FALSE; |
- |
- /** |
- * Return a result object representing the given value. |
- * |
- * @param value the value to be represented as a result object |
- * @return a result object representing the given value |
- */ |
- ValidResult valueOf3(double value) => new ValidResult(value); |
- |
- /** |
- * Return a result object representing the given value. |
- * |
- * @param value the value to be represented as a result object |
- * @return a result object representing the given value |
- */ |
- ValidResult valueOf4(String value) => new ValidResult(value); |
-} |