From 1fff623c1927f488b35b74a2bbe9ef919bb2980e Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Mon, 3 Feb 2020 20:38:46 +0000 Subject: [PATCH] Use TypeSystemImpl instead of TypeProvider in DartObjectImpl. We need to be able to use TypeSystemImpl in DartObjectImpl.== to call runtimeTypesEqual() instead of DartType.== Change-Id: I2021a0d86a7c304072fd8fee2d1a7e6e979100a8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/134146 Commit-Queue: Konstantin Shcheglov Reviewed-by: Brian Wilkerson --- pkg/analyzer/CHANGELOG.md | 3 + .../lib/dart/analysis/declared_variables.dart | 45 +- .../lib/dart/element/type_provider.dart | 1 + .../src/dart/analysis/library_analyzer.dart | 2 +- .../src/dart/constant/constant_verifier.dart | 21 +- .../lib/src/dart/constant/evaluation.dart | 258 ++++++---- .../constant/from_environment_evaluator.dart | 99 ++++ pkg/analyzer/lib/src/dart/constant/value.dart | 454 +++++++++++------- .../lib/src/dart/element/element.dart | 21 +- .../lib/src/dart/element/type_provider.dart | 13 +- .../lib/src/error/dead_code_verifier.dart | 13 +- .../generated/testing/element_factory.dart | 16 +- pkg/analyzer/lib/src/lint/linter.dart | 1 - .../analysis/declared_variables_test.dart | 111 ----- .../from_environment_evaluator_test.dart | 144 ++++++ pkg/analyzer/test/dart/analysis/test_all.dart | 2 +- .../test/generated/element_resolver_test.dart | 21 - .../src/dart/constant/evaluation_test.dart | 4 +- .../test/src/dart/constant/value_test.dart | 209 +++++--- .../test/src/dart/element/element_test.dart | 36 -- .../test/src/dart/resolution/resolution.dart | 3 + 21 files changed, 940 insertions(+), 537 deletions(-) create mode 100644 pkg/analyzer/lib/src/dart/constant/from_environment_evaluator.dart delete mode 100644 pkg/analyzer/test/dart/analysis/declared_variables_test.dart create mode 100644 pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md index 17ab10bc60d..743a14a9a79 100644 --- a/pkg/analyzer/CHANGELOG.md +++ b/pkg/analyzer/CHANGELOG.md @@ -4,6 +4,9 @@ feature, type arguments derived from type parameter bounds cannot be used as is, and might require erasing nullability, when the element is instantiated from a legacy library. Use `TypeSystem.instantiateToBounds2()` instead. +* Deprecated `DeclaredVariables.getBool/getInt/getString()`. These methods + are used internally for constants computation, and should not be used by + clients. ## 0.39.4 * Deprecated `DartType.name`, use `element` or `getDisplayString()` instead. diff --git a/pkg/analyzer/lib/dart/analysis/declared_variables.dart b/pkg/analyzer/lib/dart/analysis/declared_variables.dart index c33e45a6000..2b80e7ba31f 100644 --- a/pkg/analyzer/lib/dart/analysis/declared_variables.dart +++ b/pkg/analyzer/lib/dart/analysis/declared_variables.dart @@ -4,7 +4,8 @@ import 'package:analyzer/dart/constant/value.dart'; import 'package:analyzer/dart/element/type_provider.dart'; -import 'package:analyzer/src/dart/constant/value.dart'; +import 'package:analyzer/src/dart/constant/from_environment_evaluator.dart'; +import 'package:analyzer/src/generated/type_system.dart'; /// An object used to provide access to the values of variables that have been /// defined on the command line using the `-D` option. @@ -49,35 +50,18 @@ class DeclaredVariables { /// DartObject representing "unknown" is returned. If the value cannot be /// parsed as a boolean, a DartObject representing 'null' is returned. The /// [typeProvider] is the type provider used to find the type 'bool'. + @Deprecated("Clients don't need this functionality") DartObject getBool(TypeProvider typeProvider, String name) { - String value = _declaredVariables[name]; - if (value == null) { - return DartObjectImpl(typeProvider.boolType, BoolState.UNKNOWN_VALUE); - } - if (value == "true") { - return DartObjectImpl(typeProvider.boolType, BoolState.TRUE_STATE); - } else if (value == "false") { - return DartObjectImpl(typeProvider.boolType, BoolState.FALSE_STATE); - } - return DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE); + return _evaluator(typeProvider).getBool(name); } /// Return the value of the variable with the given [name] interpreted as an /// integer value. If the variable is not defined (or [name] is `null`), a /// DartObject representing "unknown" is returned. If the value cannot be /// parsed as an integer, a DartObject representing 'null' is returned. + @Deprecated("Clients don't need this functionality") DartObject getInt(TypeProvider typeProvider, String name) { - String value = _declaredVariables[name]; - if (value == null) { - return DartObjectImpl(typeProvider.intType, IntState.UNKNOWN_VALUE); - } - int bigInteger; - try { - bigInteger = int.parse(value); - } on FormatException { - return DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE); - } - return DartObjectImpl(typeProvider.intType, IntState(bigInteger)); + return _evaluator(typeProvider).getInt(name); } /// Return the value of the variable with the given [name] interpreted as a @@ -86,11 +70,18 @@ class DeclaredVariables { /// variable is not defined (or [name] is `null`), a DartObject representing /// "unknown" is returned. The [typeProvider] is the type provider used to /// find the type 'String'. + @Deprecated("Clients don't need this functionality") DartObject getString(TypeProvider typeProvider, String name) { - String value = _declaredVariables[name]; - if (value == null) { - return DartObjectImpl(typeProvider.stringType, StringState.UNKNOWN_VALUE); - } - return DartObjectImpl(typeProvider.stringType, StringState(value)); + return _evaluator(typeProvider).getString(name); + } + + FromEnvironmentEvaluator _evaluator(TypeProvider typeProvider) { + var typeSystem = TypeSystemImpl( + implicitCasts: false, + isNonNullableByDefault: false, + strictInference: false, + typeProvider: typeProvider, + ); + return FromEnvironmentEvaluator(typeSystem, this); } } diff --git a/pkg/analyzer/lib/dart/element/type_provider.dart b/pkg/analyzer/lib/dart/element/type_provider.dart index 24178c19161..385d3020064 100644 --- a/pkg/analyzer/lib/dart/element/type_provider.dart +++ b/pkg/analyzer/lib/dart/element/type_provider.dart @@ -111,6 +111,7 @@ abstract class TypeProvider { ClassElement get nullElement; /// Return a [DartObjectImpl] representing the `null` object. + @deprecated DartObjectImpl get nullObject; /// Return the type representing the built-in type 'Null'. diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart index eb287f43319..a41e3dcc7c0 100644 --- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart +++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart @@ -236,7 +236,7 @@ class LibraryAnalyzer { void _computeConstantErrors( ErrorReporter errorReporter, CompilationUnit unit) { ConstantVerifier constantVerifier = ConstantVerifier( - errorReporter, _libraryElement, _typeProvider, _declaredVariables, + errorReporter, _libraryElement, _declaredVariables, featureSet: unit.featureSet, forAnalysisDriver: true); unit.accept(constantVerifier); } diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart index 974a65f7e5e..19c32b452af 100644 --- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart +++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart @@ -11,7 +11,6 @@ import 'package:analyzer/dart/constant/value.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; -import 'package:analyzer/dart/element/type_system.dart'; import 'package:analyzer/error/error.dart'; import 'package:analyzer/error/listener.dart'; import 'package:analyzer/src/dart/ast/utilities.dart'; @@ -22,6 +21,7 @@ import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/diagnostic/diagnostic_factory.dart'; import 'package:analyzer/src/error/codes.dart'; import 'package:analyzer/src/generated/engine.dart'; +import 'package:analyzer/src/generated/type_system.dart'; /// Instances of the class `ConstantVerifier` traverse an AST structure looking /// for additional errors and warnings not covered by the parser and resolver. @@ -31,6 +31,9 @@ class ConstantVerifier extends RecursiveAstVisitor { /// The error reporter by which errors will be reported. final ErrorReporter _errorReporter; + /// The type operations. + final TypeSystemImpl _typeSystem; + /// The type provider used to access the known types. final TypeProvider _typeProvider; @@ -51,7 +54,7 @@ class ConstantVerifier extends RecursiveAstVisitor { /// Initialize a newly created constant verifier. ConstantVerifier(ErrorReporter errorReporter, LibraryElement currentLibrary, - TypeProvider typeProvider, DeclaredVariables declaredVariables, + DeclaredVariables declaredVariables, // TODO(brianwilkerson) Remove the unused parameter `forAnalysisDriver`. {bool forAnalysisDriver, // TODO(paulberry): make [featureSet] a required parameter. @@ -59,9 +62,9 @@ class ConstantVerifier extends RecursiveAstVisitor { : this._( errorReporter, currentLibrary, - typeProvider, - declaredVariables, currentLibrary.typeSystem, + currentLibrary.typeProvider, + declaredVariables, featureSet ?? (currentLibrary.context.analysisOptions as AnalysisOptionsImpl) .contextFeatures); @@ -69,16 +72,16 @@ class ConstantVerifier extends RecursiveAstVisitor { ConstantVerifier._( this._errorReporter, this._currentLibrary, + this._typeSystem, this._typeProvider, this.declaredVariables, - TypeSystem typeSystem, FeatureSet featureSet) : _constantUpdate2018Enabled = featureSet.isEnabled(Feature.constant_update_2018), _intType = _typeProvider.intType, _evaluationEngine = ConstantEvaluationEngine( _typeProvider, declaredVariables, - typeSystem: typeSystem, experimentStatus: featureSet); + typeSystem: _typeSystem, experimentStatus: featureSet); @override void visitAnnotation(Annotation node) { @@ -515,7 +518,11 @@ class ConstantVerifier extends RecursiveAstVisitor { Expression defaultValue = parameter.defaultValue; DartObjectImpl result; if (defaultValue == null) { - result = DartObjectImpl(_typeProvider.nullType, NullState.NULL_STATE); + result = DartObjectImpl( + _typeSystem, + _typeProvider.nullType, + NullState.NULL_STATE, + ); } else { result = _validate( defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE); diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart index d577938bd95..df11b716e0e 100644 --- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart +++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart @@ -18,6 +18,7 @@ import 'package:analyzer/dart/element/type_system.dart'; import 'package:analyzer/error/error.dart'; import 'package:analyzer/error/listener.dart'; import 'package:analyzer/src/dart/analysis/experiments.dart'; +import 'package:analyzer/src/dart/constant/from_environment_evaluator.dart'; import 'package:analyzer/src/dart/constant/potentially_constant.dart'; import 'package:analyzer/src/dart/constant/utilities.dart'; import 'package:analyzer/src/dart/constant/value.dart'; @@ -67,8 +68,9 @@ class ConstantEvaluationEngine { /// exact value is unknown. final TypeSystem typeSystem; - /// The set of variables declared on the command line using '-D'. - final DeclaredVariables _declaredVariables; + /// The helper for evaluating variables declared on the command line + /// using '-D', and represented as [DeclaredVariables]. + FromEnvironmentEvaluator _fromEnvironmentEvaluator; /// Return the object representing the state of active experiments. final ExperimentStatus experimentStatus; @@ -78,11 +80,12 @@ class ConstantEvaluationEngine { final ConstantEvaluationValidator validator; /// Initialize a newly created [ConstantEvaluationEngine]. The [typeProvider] - /// is used to access known types. [_declaredVariables] is the set of + /// is used to access known types. [_fromEnvironmentEvaluator] is the set of /// variables declared on the command line using '-D'. The [validator], if /// given, is used to verify correct dependency analysis when running unit /// tests. - ConstantEvaluationEngine(TypeProvider typeProvider, this._declaredVariables, + ConstantEvaluationEngine( + TypeProvider typeProvider, DeclaredVariables declaredVariables, {ConstantEvaluationValidator validator, ExperimentStatus experimentStatus, TypeSystem typeSystem, @@ -97,12 +100,25 @@ class ConstantEvaluationEngine { strictInference: false, typeProvider: typeProvider, ), - experimentStatus = experimentStatus ?? ExperimentStatus(); + experimentStatus = experimentStatus ?? ExperimentStatus() { + _fromEnvironmentEvaluator = FromEnvironmentEvaluator( + typeSystem, + declaredVariables, + ); + } bool get _isNonNullableByDefault { return (typeSystem as TypeSystemImpl).isNonNullableByDefault; } + DartObjectImpl get _nullObject { + return DartObjectImpl( + typeSystem, + typeProvider.nullType, + NullState.NULL_STATE, + ); + } + /// Check that the arguments to a call to fromEnvironment() are correct. The /// [arguments] are the AST nodes of the arguments. The [argumentValues] are /// the values of the unnamed arguments. The [namedArgumentValues] are the @@ -190,8 +206,7 @@ class ConstantEvaluationEngine { constant.evaluationResult = EvaluationResultImpl(dartObject, errorListener.errors); } else { - constant.evaluationResult = - EvaluationResultImpl(typeProvider.nullObject); + constant.evaluationResult = EvaluationResultImpl(_nullObject); } } } else if (constant is VariableElementImpl) { @@ -460,7 +475,10 @@ class ConstantEvaluationEngine { // in this case, as well as other cases involving constant expression // circularities (e.g. "compile-time constant expression depends on // itself") - return DartObjectImpl.validWithUnknownValue(constructor.returnType); + return DartObjectImpl.validWithUnknownValue( + typeSystem, + constructor.returnType, + ); } int argumentCount = arguments.length; @@ -509,27 +527,41 @@ class ConstantEvaluationEngine { if (definingClass == typeProvider.boolType) { DartObject valueFromEnvironment; valueFromEnvironment = - _declaredVariables.getBool(typeProvider, variableName); + _fromEnvironmentEvaluator.getBool(variableName); return computeValueFromEnvironment( - valueFromEnvironment, - DartObjectImpl(typeProvider.boolType, BoolState.FALSE_STATE), - namedValues); + valueFromEnvironment, + DartObjectImpl( + typeSystem, + typeProvider.boolType, + BoolState.FALSE_STATE, + ), + namedValues, + ); } else if (definingClass == typeProvider.intType) { DartObject valueFromEnvironment; - valueFromEnvironment = - _declaredVariables.getInt(typeProvider, variableName); + valueFromEnvironment = _fromEnvironmentEvaluator.getInt(variableName); return computeValueFromEnvironment( - valueFromEnvironment, - DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE), - namedValues); + valueFromEnvironment, + DartObjectImpl( + typeSystem, + typeProvider.nullType, + NullState.NULL_STATE, + ), + namedValues, + ); } else if (definingClass == typeProvider.stringType) { DartObject valueFromEnvironment; valueFromEnvironment = - _declaredVariables.getString(typeProvider, variableName); + _fromEnvironmentEvaluator.getString(variableName); return computeValueFromEnvironment( - valueFromEnvironment, - DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE), - namedValues); + valueFromEnvironment, + DartObjectImpl( + typeSystem, + typeProvider.nullType, + NullState.NULL_STATE, + ), + namedValues, + ); } } else if (constructor.name == "" && definingClass == typeProvider.symbolType && @@ -540,7 +572,11 @@ class ConstantEvaluationEngine { return null; } String argumentValue = argumentValues[0].toStringValue(); - return DartObjectImpl(definingClass, SymbolState(argumentValue)); + return DartObjectImpl( + typeSystem, + definingClass, + SymbolState(argumentValue), + ); } // Either it's an external const factory constructor that we can't // emulate, or an error occurred (a cycle, or a const constructor trying @@ -548,7 +584,7 @@ class ConstantEvaluationEngine { // In the former case, the best we can do is consider it an unknown value. // In the latter case, the error has already been reported, so considering // it an unknown value will suppress further errors. - return DartObjectImpl.validWithUnknownValue(definingClass); + return DartObjectImpl.validWithUnknownValue(typeSystem, definingClass); } ConstructorElementImpl constructorBase = constructor.declaration; validator.beforeGetConstantInitializers(constructorBase); @@ -560,7 +596,7 @@ class ConstantEvaluationEngine { // const instance using a non-const constructor, or the node we're // visiting is involved in a cycle). The error has already been reported, // so consider it an unknown value to suppress further errors. - return DartObjectImpl.validWithUnknownValue(definingClass); + return DartObjectImpl.validWithUnknownValue(typeSystem, definingClass); } var fieldMap = HashMap(); @@ -639,7 +675,7 @@ class ConstantEvaluationEngine { EvaluationResultImpl evaluationResult = baseParameter.evaluationResult; if (evaluationResult == null) { // No default was provided, so the default value is null. - argumentValue = typeProvider.nullObject; + argumentValue = _nullObject; } else if (evaluationResult.value != null) { argumentValue = evaluationResult.value; } @@ -775,7 +811,10 @@ class ConstantEvaluationEngine { CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node); } return DartObjectImpl( - definingClass, GenericState(fieldMap, invocation: invocation)); + typeSystem, + definingClass, + GenericState(fieldMap, invocation: invocation), + ); } void evaluateSuperConstructorCall( @@ -1105,8 +1144,13 @@ class ConstantVisitor extends UnifyingAstVisitor { } @override - DartObjectImpl visitBooleanLiteral(BooleanLiteral node) => - DartObjectImpl(_typeProvider.boolType, BoolState.from(node.value)); + DartObjectImpl visitBooleanLiteral(BooleanLiteral node) { + return DartObjectImpl( + typeSystem, + _typeProvider.boolType, + BoolState.from(node.value), + ); + } @override DartObjectImpl visitConditionalExpression(ConditionalExpression node) { @@ -1164,12 +1208,19 @@ class ConstantVisitor extends UnifyingAstVisitor { ParameterizedType thenType = thenResult.type; ParameterizedType elseType = elseResult.type; return DartObjectImpl.validWithUnknownValue( - typeSystem.leastUpperBound(thenType, elseType) as ParameterizedType); + typeSystem, + typeSystem.leastUpperBound(thenType, elseType) as ParameterizedType, + ); } @override - DartObjectImpl visitDoubleLiteral(DoubleLiteral node) => - DartObjectImpl(_typeProvider.doubleType, DoubleState(node.value)); + DartObjectImpl visitDoubleLiteral(DoubleLiteral node) { + return DartObjectImpl( + typeSystem, + _typeProvider.doubleType, + DoubleState(node.value), + ); + } @override DartObjectImpl visitInstanceCreationExpression( @@ -1194,9 +1245,16 @@ class ConstantVisitor extends UnifyingAstVisitor { DartObjectImpl visitIntegerLiteral(IntegerLiteral node) { if (node.staticType == _typeProvider.doubleType) { return DartObjectImpl( - _typeProvider.doubleType, DoubleState(node.value?.toDouble())); + typeSystem, + _typeProvider.doubleType, + DoubleState(node.value?.toDouble()), + ); } - return DartObjectImpl(_typeProvider.intType, IntState(node.value)); + return DartObjectImpl( + typeSystem, + _typeProvider.intType, + IntState(node.value), + ); } @override @@ -1210,8 +1268,13 @@ class ConstantVisitor extends UnifyingAstVisitor { } @override - DartObjectImpl visitInterpolationString(InterpolationString node) => - DartObjectImpl(_typeProvider.stringType, StringState(node.value)); + DartObjectImpl visitInterpolationString(InterpolationString node) { + return DartObjectImpl( + typeSystem, + _typeProvider.stringType, + StringState(node.value), + ); + } @override DartObjectImpl visitIsExpression(IsExpression node) { @@ -1246,7 +1309,7 @@ class ConstantVisitor extends UnifyingAstVisitor { ? nodeType.typeArguments[0] : _typeProvider.dynamicType; InterfaceType listType = _typeProvider.listType2(elementType); - return DartObjectImpl(listType, ListState(list)); + return DartObjectImpl(typeSystem, listType, ListState(list)); } @override @@ -1286,7 +1349,9 @@ class ConstantVisitor extends UnifyingAstVisitor { } @override - DartObjectImpl visitNullLiteral(NullLiteral node) => _typeProvider.nullObject; + DartObjectImpl visitNullLiteral(NullLiteral node) { + return evaluationEngine._nullObject; + } @override DartObjectImpl visitParenthesizedExpression(ParenthesizedExpression node) => @@ -1302,7 +1367,7 @@ class ConstantVisitor extends UnifyingAstVisitor { prefixElement is! ExtensionElement) { DartObjectImpl prefixResult = prefixNode.accept(this); if (_isStringLength(prefixResult, node.identifier)) { - return prefixResult.stringLength(_typeProvider); + return prefixResult.stringLength(typeSystem); } } // importPrefix.CONST @@ -1342,7 +1407,7 @@ class ConstantVisitor extends UnifyingAstVisitor { if (node.target != null) { DartObjectImpl prefixResult = node.target.accept(this); if (_isStringLength(prefixResult, node.propertyName)) { - return prefixResult.stringLength(_typeProvider); + return prefixResult.stringLength(typeSystem); } } return _getConstantValue(node, node.propertyName.staticElement); @@ -1382,7 +1447,7 @@ class ConstantVisitor extends UnifyingAstVisitor { } } InterfaceType mapType = _typeProvider.mapType2(keyType, valueType); - return DartObjectImpl(mapType, MapState(map)); + return DartObjectImpl(typeSystem, mapType, MapState(map)); } else { if (!node.isConst) { _errorReporter.reportErrorForNode( @@ -1403,7 +1468,7 @@ class ConstantVisitor extends UnifyingAstVisitor { ? nodeType.typeArguments[0] : _typeProvider.dynamicType; InterfaceType setType = _typeProvider.setType2(elementType); - return DartObjectImpl(setType, SetState(set)); + return DartObjectImpl(typeSystem, setType, SetState(set)); } } @@ -1417,8 +1482,13 @@ class ConstantVisitor extends UnifyingAstVisitor { } @override - DartObjectImpl visitSimpleStringLiteral(SimpleStringLiteral node) => - DartObjectImpl(_typeProvider.stringType, StringState(node.value)); + DartObjectImpl visitSimpleStringLiteral(SimpleStringLiteral node) { + return DartObjectImpl( + typeSystem, + _typeProvider.stringType, + StringState(node.value), + ); + } @override DartObjectImpl visitStringInterpolation(StringInterpolation node) { @@ -1447,7 +1517,10 @@ class ConstantVisitor extends UnifyingAstVisitor { buffer.write(components[i].lexeme); } return DartObjectImpl( - _typeProvider.symbolType, SymbolState(buffer.toString())); + typeSystem, + _typeProvider.symbolType, + SymbolState(buffer.toString()), + ); } @override @@ -1456,7 +1529,11 @@ class ConstantVisitor extends UnifyingAstVisitor { if (_hasTypeParameterReference(type)) { return super.visitTypeName(node); } - return DartObjectImpl(_typeProvider.typeType, TypeState(type)); + return DartObjectImpl( + typeSystem, + _typeProvider.typeType, + TypeState(type), + ); } /// Add the entries produced by evaluating the given collection [element] to @@ -1626,7 +1703,11 @@ class ConstantVisitor extends UnifyingAstVisitor { ExecutableElement function = element; if (function.isStatic) { var functionType = node.staticType; - return DartObjectImpl(functionType, FunctionState(function)); + return DartObjectImpl( + typeSystem, + functionType, + FunctionState(function), + ); } } else if (variableElement is ClassElement) { var type = variableElement.instantiate( @@ -1635,9 +1716,14 @@ class ConstantVisitor extends UnifyingAstVisitor { .toList(), nullabilitySuffix: NullabilitySuffix.star, ); - return DartObjectImpl(_typeProvider.typeType, TypeState(type)); + return DartObjectImpl( + typeSystem, + _typeProvider.typeType, + TypeState(type), + ); } else if (variableElement is DynamicElementImpl) { return DartObjectImpl( + typeSystem, _typeProvider.typeType, TypeState(_typeProvider.dynamicType), ); @@ -1648,9 +1734,14 @@ class ConstantVisitor extends UnifyingAstVisitor { .toList(), nullabilitySuffix: NullabilitySuffix.star, ); - return DartObjectImpl(_typeProvider.typeType, TypeState(type)); + return DartObjectImpl( + typeSystem, + _typeProvider.typeType, + TypeState(type), + ); } else if (variableElement is NeverElementImpl) { return DartObjectImpl( + typeSystem, _typeProvider.typeType, TypeState(_typeProvider.neverType), ); @@ -1693,7 +1784,7 @@ class ConstantVisitor extends UnifyingAstVisitor { if (expressionValue != null) { return expressionValue; } - return _typeProvider.nullObject; + return evaluationEngine._nullObject; } /// Return `true` if the [type] has a type parameter reference, so is not @@ -1720,10 +1811,6 @@ class DartObjectComputer { DartObjectComputer(this._errorReporter, this._evaluationEngine); - /// Convenience getter to gain access to the [evaluationEngine]'s type - /// provider. - TypeProvider get _typeProvider => _evaluationEngine.typeProvider; - /// Convenience getter to gain access to the [evaluationEngine]'s type system. TypeSystem get _typeSystem => _evaluationEngine.typeSystem; @@ -1731,7 +1818,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.add(_typeProvider, rightOperand); + return leftOperand.add(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); return null; @@ -1747,7 +1834,7 @@ class DartObjectComputer { AstNode node, DartObjectImpl evaluationResult) { if (evaluationResult != null) { try { - return evaluationResult.convertToBool(_typeProvider); + return evaluationResult.convertToBool(_typeSystem); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1758,7 +1845,7 @@ class DartObjectComputer { DartObjectImpl bitNot(Expression node, DartObjectImpl evaluationResult) { if (evaluationResult != null) { try { - return evaluationResult.bitNot(_typeProvider); + return evaluationResult.bitNot(_typeSystem); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1770,7 +1857,7 @@ class DartObjectComputer { AsExpression node, DartObjectImpl expression, DartObjectImpl type) { if (expression != null && type != null) { try { - return expression.castToType(_typeProvider, _typeSystem, type); + return expression.castToType(_typeSystem, type); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1782,7 +1869,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.concatenate(_typeProvider, rightOperand); + return leftOperand.concatenate(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1794,7 +1881,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.divide(_typeProvider, rightOperand); + return leftOperand.divide(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1806,7 +1893,7 @@ class DartObjectComputer { DartObjectImpl rightOperand, bool allowBool) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.eagerAnd(_typeProvider, rightOperand, allowBool); + return leftOperand.eagerAnd(_typeSystem, rightOperand, allowBool); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1818,7 +1905,7 @@ class DartObjectComputer { DartObjectImpl rightOperand, bool allowBool) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.eagerOr(_typeProvider, rightOperand, allowBool); + return leftOperand.eagerOr(_typeSystem, rightOperand, allowBool); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1841,7 +1928,7 @@ class DartObjectComputer { DartObjectImpl rightOperand, bool allowBool) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.eagerXor(_typeProvider, rightOperand, allowBool); + return leftOperand.eagerXor(_typeSystem, rightOperand, allowBool); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1853,7 +1940,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.equalEqual(_typeProvider, rightOperand); + return leftOperand.equalEqual(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1865,7 +1952,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.greaterThan(_typeProvider, rightOperand); + return leftOperand.greaterThan(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1877,7 +1964,7 @@ class DartObjectComputer { DartObjectImpl leftOperand, DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.greaterThanOrEqual(_typeProvider, rightOperand); + return leftOperand.greaterThanOrEqual(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1889,7 +1976,7 @@ class DartObjectComputer { DartObjectImpl leftOperand, DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.integerDivide(_typeProvider, rightOperand); + return leftOperand.integerDivide(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1901,7 +1988,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.isIdentical(_typeProvider, rightOperand); + return leftOperand.isIdentical2(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1913,7 +2000,7 @@ class DartObjectComputer { DartObjectImpl Function() rightOperandComputer) { if (leftOperand != null) { try { - return leftOperand.lazyAnd(_typeProvider, rightOperandComputer); + return leftOperand.lazyAnd(_typeSystem, rightOperandComputer); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1925,7 +2012,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.lazyEqualEqual(_typeProvider, rightOperand); + return leftOperand.lazyEqualEqual(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1937,7 +2024,7 @@ class DartObjectComputer { DartObjectImpl Function() rightOperandComputer) { if (leftOperand != null) { try { - return leftOperand.lazyOr(_typeProvider, rightOperandComputer); + return leftOperand.lazyOr(_typeSystem, rightOperandComputer); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1962,7 +2049,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.lessThan(_typeProvider, rightOperand); + return leftOperand.lessThan(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1974,7 +2061,7 @@ class DartObjectComputer { DartObjectImpl leftOperand, DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.lessThanOrEqual(_typeProvider, rightOperand); + return leftOperand.lessThanOrEqual(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1985,7 +2072,7 @@ class DartObjectComputer { DartObjectImpl logicalNot(Expression node, DartObjectImpl evaluationResult) { if (evaluationResult != null) { try { - return evaluationResult.logicalNot(_typeProvider); + return evaluationResult.logicalNot(_typeSystem); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -1997,7 +2084,7 @@ class DartObjectComputer { DartObjectImpl leftOperand, DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.logicalShiftRight(_typeProvider, rightOperand); + return leftOperand.logicalShiftRight(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -2009,7 +2096,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.minus(_typeProvider, rightOperand); + return leftOperand.minus(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -2020,7 +2107,7 @@ class DartObjectComputer { DartObjectImpl negated(Expression node, DartObjectImpl evaluationResult) { if (evaluationResult != null) { try { - return evaluationResult.negated(_typeProvider); + return evaluationResult.negated(_typeSystem); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -2032,7 +2119,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.notEqual(_typeProvider, rightOperand); + return leftOperand.notEqual(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -2044,7 +2131,7 @@ class DartObjectComputer { AstNode node, DartObjectImpl evaluationResult) { if (evaluationResult != null) { try { - return evaluationResult.performToString(_typeProvider); + return evaluationResult.performToString(_typeSystem); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -2056,7 +2143,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.remainder(_typeProvider, rightOperand); + return leftOperand.remainder(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -2068,7 +2155,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.shiftLeft(_typeProvider, rightOperand); + return leftOperand.shiftLeft(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -2080,7 +2167,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.shiftRight(_typeProvider, rightOperand); + return leftOperand.shiftRight(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -2096,7 +2183,7 @@ class DartObjectComputer { if (evaluationResult.value != null) { try { return EvaluationResultImpl( - evaluationResult.value.stringLength(_typeProvider)); + evaluationResult.value.stringLength(_typeSystem)); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -2108,7 +2195,7 @@ class DartObjectComputer { DartObjectImpl rightOperand) { if (leftOperand != null && rightOperand != null) { try { - return leftOperand.times(_typeProvider, rightOperand); + return leftOperand.times(_typeSystem, rightOperand); } on EvaluationException catch (exception) { _errorReporter.reportErrorForNode(exception.errorCode, node); } @@ -2120,10 +2207,9 @@ class DartObjectComputer { IsExpression node, DartObjectImpl expression, DartObjectImpl type) { if (expression != null && type != null) { try { - DartObjectImpl result = - expression.hasType(_typeProvider, _typeSystem, type); + DartObjectImpl result = expression.hasType(_typeSystem, type); if (node.notOperator != null) { - return result.logicalNot(_typeProvider); + return result.logicalNot(_typeSystem); } return result; } on EvaluationException catch (exception) { diff --git a/pkg/analyzer/lib/src/dart/constant/from_environment_evaluator.dart b/pkg/analyzer/lib/src/dart/constant/from_environment_evaluator.dart new file mode 100644 index 00000000000..92534ce190d --- /dev/null +++ b/pkg/analyzer/lib/src/dart/constant/from_environment_evaluator.dart @@ -0,0 +1,99 @@ +// Copyright (c) 2020, 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. + +import 'package:analyzer/dart/analysis/declared_variables.dart'; +import 'package:analyzer/dart/constant/value.dart'; +import 'package:analyzer/src/dart/constant/value.dart'; +import 'package:analyzer/src/generated/type_system.dart'; + +class FromEnvironmentEvaluator { + final TypeSystemImpl _typeSystem; + final DeclaredVariables _declaredVariables; + + FromEnvironmentEvaluator(this._typeSystem, this._declaredVariables); + + /// Return the value of the variable with the given [name] interpreted as a + /// 'boolean' value. If the variable is not defined (or [name] is `null`), a + /// DartObject representing "unknown" is returned. If the value cannot be + /// parsed as a boolean, a DartObject representing 'null' is returned. + DartObject getBool(String name) { + String value = _declaredVariables.get(name); + if (value == null) { + return DartObjectImpl( + _typeSystem, + _typeSystem.typeProvider.boolType, + BoolState.UNKNOWN_VALUE, + ); + } + if (value == "true") { + return DartObjectImpl( + _typeSystem, + _typeSystem.typeProvider.boolType, + BoolState.TRUE_STATE, + ); + } else if (value == "false") { + return DartObjectImpl( + _typeSystem, + _typeSystem.typeProvider.boolType, + BoolState.FALSE_STATE, + ); + } + return DartObjectImpl( + _typeSystem, + _typeSystem.typeProvider.nullType, + NullState.NULL_STATE, + ); + } + + /// Return the value of the variable with the given [name] interpreted as an + /// integer value. If the variable is not defined (or [name] is `null`), a + /// DartObject representing "unknown" is returned. If the value cannot be + /// parsed as an integer, a DartObject representing 'null' is returned. + DartObject getInt(String name) { + String value = _declaredVariables.get(name); + if (value == null) { + return DartObjectImpl( + _typeSystem, + _typeSystem.typeProvider.intType, + IntState.UNKNOWN_VALUE, + ); + } + int bigInteger; + try { + bigInteger = int.parse(value); + } on FormatException { + return DartObjectImpl( + _typeSystem, + _typeSystem.typeProvider.nullType, + NullState.NULL_STATE, + ); + } + return DartObjectImpl( + _typeSystem, + _typeSystem.typeProvider.intType, + IntState(bigInteger), + ); + } + + /// Return the value of the variable with the given [name] interpreted as a + /// String value, or `null` if the variable is not defined. Return the value + /// of the variable with the given name interpreted as a String value. If the + /// variable is not defined (or [name] is `null`), a DartObject representing + /// "unknown" is returned. + DartObject getString(String name) { + String value = _declaredVariables.get(name); + if (value == null) { + return DartObjectImpl( + _typeSystem, + _typeSystem.typeProvider.stringType, + StringState.UNKNOWN_VALUE, + ); + } + return DartObjectImpl( + _typeSystem, + _typeSystem.typeProvider.stringType, + StringState(value), + ); + } +} diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart index 04dc28d95b1..ab9e6f6a860 100644 --- a/pkg/analyzer/lib/src/dart/constant/value.dart +++ b/pkg/analyzer/lib/src/dart/constant/value.dart @@ -9,9 +9,9 @@ import 'package:analyzer/dart/constant/value.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; -import 'package:analyzer/dart/element/type_system.dart'; import 'package:analyzer/error/error.dart'; import 'package:analyzer/src/error/codes.dart'; +import 'package:analyzer/src/generated/type_system.dart'; import 'package:analyzer/src/generated/utilities_general.dart'; /// The state of an object representing a boolean value. @@ -146,6 +146,9 @@ class ConstructorInvocation { /// A representation of an instance of a Dart class. class DartObjectImpl implements DartObject { + // ignore: unused_field + final TypeSystemImpl _typeSystem; + @override final ParameterizedType type; @@ -153,22 +156,25 @@ class DartObjectImpl implements DartObject { final InstanceState _state; /// Initialize a newly created object to have the given [type] and [_state]. - DartObjectImpl(this.type, this._state); + DartObjectImpl(this._typeSystem, this.type, this._state); /// Create an object to represent an unknown value. - factory DartObjectImpl.validWithUnknownValue(ParameterizedType type) { + factory DartObjectImpl.validWithUnknownValue( + TypeSystemImpl typeSystem, + ParameterizedType type, + ) { if (type.element.library.isDartCore) { if (type.isDartCoreBool) { - return DartObjectImpl(type, BoolState.UNKNOWN_VALUE); + return DartObjectImpl(typeSystem, type, BoolState.UNKNOWN_VALUE); } else if (type.isDartCoreDouble) { - return DartObjectImpl(type, DoubleState.UNKNOWN_VALUE); + return DartObjectImpl(typeSystem, type, DoubleState.UNKNOWN_VALUE); } else if (type.isDartCoreInt) { - return DartObjectImpl(type, IntState.UNKNOWN_VALUE); + return DartObjectImpl(typeSystem, type, IntState.UNKNOWN_VALUE); } else if (type.isDartCoreString) { - return DartObjectImpl(type, StringState.UNKNOWN_VALUE); + return DartObjectImpl(typeSystem, type, StringState.UNKNOWN_VALUE); } } - return DartObjectImpl(type, GenericState.UNKNOWN_VALUE); + return DartObjectImpl(typeSystem, type, GenericState.UNKNOWN_VALUE); } Map get fields => _state.fields; @@ -208,35 +214,50 @@ class DartObjectImpl implements DartObject { } /// Return the result of invoking the '+' operator on this object with the - /// given [rightOperand]. The [typeProvider] is the type provider used to find - /// known types. + /// given [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. - DartObjectImpl add(TypeProvider typeProvider, DartObjectImpl rightOperand) { + DartObjectImpl add(TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { InstanceState result = _state.add(rightOperand._state); if (result is IntState) { - return DartObjectImpl(typeProvider.intType, result); + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.intType, + result, + ); } else if (result is DoubleState) { - return DartObjectImpl(typeProvider.doubleType, result); + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.doubleType, + result, + ); } else if (result is StringState) { - return DartObjectImpl(typeProvider.stringType, result); + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.stringType, + result, + ); } // We should never get here. throw StateError("add returned a ${result.runtimeType}"); } - /// Return the result of invoking the '~' operator on this object. The - /// [typeProvider] is the type provider used to find known types. + /// Return the result of invoking the '~' operator on this object. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. - DartObjectImpl bitNot(TypeProvider typeProvider) => - DartObjectImpl(typeProvider.intType, _state.bitNot()); + DartObjectImpl bitNot(TypeSystemImpl typeSystem) { + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.intType, + _state.bitNot(), + ); + } /// Return the result of casting this object to the given [castType]. - DartObjectImpl castToType(TypeProvider typeProvider, TypeSystem typeSystem, - DartObjectImpl castType) { + DartObjectImpl castToType( + TypeSystemImpl typeSystem, DartObjectImpl castType) { _assertType(castType); if (isNull) { return this; @@ -249,119 +270,147 @@ class DartObjectImpl implements DartObject { } /// Return the result of invoking the ' ' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl concatenate( - TypeProvider typeProvider, DartObjectImpl rightOperand) => - DartObjectImpl( - typeProvider.stringType, _state.concatenate(rightOperand._state)); + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.stringType, + _state.concatenate(rightOperand._state), + ); + } - /// Return the result of applying boolean conversion to this object. The - /// [typeProvider] is the type provider used to find known types. + /// Return the result of applying boolean conversion to this object. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. - DartObjectImpl convertToBool(TypeProvider typeProvider) { - InterfaceType boolType = typeProvider.boolType; + DartObjectImpl convertToBool(TypeSystemImpl typeSystem) { + InterfaceType boolType = typeSystem.typeProvider.boolType; if (identical(type, boolType)) { return this; } - return DartObjectImpl(boolType, _state.convertToBool()); + return DartObjectImpl(typeSystem, boolType, _state.convertToBool()); } /// Return the result of invoking the '/' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for /// an object of this kind. DartObjectImpl divide( - TypeProvider typeProvider, DartObjectImpl rightOperand) { + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { InstanceState result = _state.divide(rightOperand._state); if (result is IntState) { - return DartObjectImpl(typeProvider.intType, result); + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.intType, + result, + ); } else if (result is DoubleState) { - return DartObjectImpl(typeProvider.doubleType, result); + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.doubleType, + result, + ); } // We should never get here. throw StateError("divide returned a ${result.runtimeType}"); } /// Return the result of invoking the '&' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl eagerAnd( - TypeProvider typeProvider, DartObjectImpl rightOperand, bool allowBool) { + TypeSystemImpl typeSystem, DartObjectImpl rightOperand, bool allowBool) { if (allowBool && isBool && rightOperand.isBool) { return DartObjectImpl( - typeProvider.boolType, _state.logicalAnd(rightOperand._state)); + typeSystem, + typeSystem.typeProvider.boolType, + _state.logicalAnd(rightOperand._state), + ); } else if (isInt && rightOperand.isInt) { return DartObjectImpl( - typeProvider.intType, _state.bitAnd(rightOperand._state)); + typeSystem, + typeSystem.typeProvider.intType, + _state.bitAnd(rightOperand._state), + ); } throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT); } /// Return the result of invoking the '|' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl eagerOr( - TypeProvider typeProvider, DartObjectImpl rightOperand, bool allowBool) { + TypeSystemImpl typeSystem, DartObjectImpl rightOperand, bool allowBool) { if (allowBool && isBool && rightOperand.isBool) { return DartObjectImpl( - typeProvider.boolType, _state.logicalOr(rightOperand._state)); + typeSystem, + typeSystem.typeProvider.boolType, + _state.logicalOr(rightOperand._state), + ); } else if (isInt && rightOperand.isInt) { return DartObjectImpl( - typeProvider.intType, _state.bitOr(rightOperand._state)); + typeSystem, + typeSystem.typeProvider.intType, + _state.bitOr(rightOperand._state), + ); } throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT); } /// Return the result of invoking the '^' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl eagerXor( - TypeProvider typeProvider, DartObjectImpl rightOperand, bool allowBool) { + TypeSystemImpl typeSystem, DartObjectImpl rightOperand, bool allowBool) { if (allowBool && isBool && rightOperand.isBool) { return DartObjectImpl( - typeProvider.boolType, _state.logicalXor(rightOperand._state)); + typeSystem, + typeSystem.typeProvider.boolType, + _state.logicalXor(rightOperand._state), + ); } else if (isInt && rightOperand.isInt) { return DartObjectImpl( - typeProvider.intType, _state.bitXor(rightOperand._state)); + typeSystem, + typeSystem.typeProvider.intType, + _state.bitXor(rightOperand._state), + ); } throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT); } /// Return the result of invoking the '==' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl equalEqual( - TypeProvider typeProvider, DartObjectImpl rightOperand) { + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { if (isNull || rightOperand.isNull) { return DartObjectImpl( - typeProvider.boolType, - isNull && rightOperand.isNull - ? BoolState.TRUE_STATE - : BoolState.FALSE_STATE); + typeSystem, + typeSystem.typeProvider.boolType, + isNull && rightOperand.isNull + ? BoolState.TRUE_STATE + : BoolState.FALSE_STATE, + ); } if (isBoolNumStringOrNull) { return DartObjectImpl( - typeProvider.boolType, _state.equalEqual(rightOperand._state)); + typeSystem, + typeSystem.typeProvider.boolType, + _state.equalEqual(rightOperand._state), + ); } throw EvaluationException( CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING); @@ -387,38 +436,43 @@ class DartObjectImpl implements DartObject { } /// Return the result of invoking the '>' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl greaterThan( - TypeProvider typeProvider, DartObjectImpl rightOperand) => - DartObjectImpl( - typeProvider.boolType, _state.greaterThan(rightOperand._state)); + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.boolType, + _state.greaterThan(rightOperand._state), + ); + } /// Return the result of invoking the '>=' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl greaterThanOrEqual( - TypeProvider typeProvider, DartObjectImpl rightOperand) => - DartObjectImpl(typeProvider.boolType, - _state.greaterThanOrEqual(rightOperand._state)); + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.boolType, + _state.greaterThanOrEqual(rightOperand._state), + ); + } /// Return the result of testing whether this object has the given /// [testedType]. - DartObjectImpl hasType(TypeProvider typeProvider, TypeSystem typeSystem, - DartObjectImpl testedType) { + DartObjectImpl hasType(TypeSystemImpl typeSystem, DartObjectImpl testedType) { _assertType(testedType); DartType typeType = (testedType._state as TypeState)._type; BoolState state; if (isNull) { - if (typeType == typeProvider.objectType || - typeType == typeProvider.dynamicType || - typeType == typeProvider.nullType) { + if (typeType == typeSystem.typeProvider.objectType || + typeType == typeSystem.typeProvider.dynamicType || + typeType == typeSystem.typeProvider.nullType) { state = BoolState.TRUE_STATE; } else { state = BoolState.FALSE_STATE; @@ -426,232 +480,310 @@ class DartObjectImpl implements DartObject { } else { state = BoolState.from(typeSystem.isSubtypeOf(type, typeType)); } - return DartObjectImpl(typeProvider.boolType, state); + return DartObjectImpl(typeSystem, typeSystem.typeProvider.boolType, state); } /// Return the result of invoking the '~/' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl integerDivide( - TypeProvider typeProvider, DartObjectImpl rightOperand) => - DartObjectImpl( - typeProvider.intType, _state.integerDivide(rightOperand._state)); + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.intType, + _state.integerDivide(rightOperand._state), + ); + } /// Return the result of invoking the identical function on this object with /// the [rightOperand]. The [typeProvider] is the type provider used to find /// known types. + @Deprecated('Use isIdentical2() instead') DartObjectImpl isIdentical( TypeProvider typeProvider, DartObjectImpl rightOperand) { + var typeSystem = TypeSystemImpl( + implicitCasts: false, + isNonNullableByDefault: false, + strictInference: false, + typeProvider: typeProvider, + ); + return isIdentical2(typeSystem, rightOperand); + } + + /// Return the result of invoking the identical function on this object with + /// the [rightOperand]. + DartObjectImpl isIdentical2( + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { return DartObjectImpl( - typeProvider.boolType, _state.isIdentical(rightOperand._state)); + typeSystem, + typeSystem.typeProvider.boolType, + _state.isIdentical(rightOperand._state), + ); } /// Return the result of invoking the '&&' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. - DartObjectImpl lazyAnd(TypeProvider typeProvider, - DartObjectImpl Function() rightOperandComputer) => - DartObjectImpl(typeProvider.boolType, - _state.lazyAnd(() => rightOperandComputer()?._state)); + DartObjectImpl lazyAnd(TypeSystemImpl typeSystem, + DartObjectImpl Function() rightOperandComputer) { + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.boolType, + _state.lazyAnd(() => rightOperandComputer()?._state), + ); + } /// Return the result of invoking the '==' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl lazyEqualEqual( - TypeProvider typeProvider, DartObjectImpl rightOperand) { + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { if (isNull || rightOperand.isNull) { return DartObjectImpl( - typeProvider.boolType, - isNull && rightOperand.isNull - ? BoolState.TRUE_STATE - : BoolState.FALSE_STATE); + typeSystem, + typeSystem.typeProvider.boolType, + isNull && rightOperand.isNull + ? BoolState.TRUE_STATE + : BoolState.FALSE_STATE, + ); } if (isBoolNumStringOrNull) { return DartObjectImpl( - typeProvider.boolType, _state.lazyEqualEqual(rightOperand._state)); + typeSystem, + typeSystem.typeProvider.boolType, + _state.lazyEqualEqual(rightOperand._state), + ); } throw EvaluationException( CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING); } /// Return the result of invoking the '||' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. - DartObjectImpl lazyOr(TypeProvider typeProvider, + DartObjectImpl lazyOr(TypeSystemImpl typeSystem, DartObjectImpl Function() rightOperandComputer) => - DartObjectImpl(typeProvider.boolType, - _state.lazyOr(() => rightOperandComputer()?._state)); + DartObjectImpl( + typeSystem, + typeSystem.typeProvider.boolType, + _state.lazyOr(() => rightOperandComputer()?._state), + ); /// Return the result of invoking the '<' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl lessThan( - TypeProvider typeProvider, DartObjectImpl rightOperand) => - DartObjectImpl( - typeProvider.boolType, _state.lessThan(rightOperand._state)); + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.boolType, + _state.lessThan(rightOperand._state), + ); + } /// Return the result of invoking the '<=' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl lessThanOrEqual( - TypeProvider typeProvider, DartObjectImpl rightOperand) => - DartObjectImpl( - typeProvider.boolType, _state.lessThanOrEqual(rightOperand._state)); + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.boolType, + _state.lessThanOrEqual(rightOperand._state), + ); + } - /// Return the result of invoking the '!' operator on this object. The - /// [typeProvider] is the type provider used to find known types. + /// Return the result of invoking the '!' operator on this object. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. - DartObjectImpl logicalNot(TypeProvider typeProvider) => - DartObjectImpl(typeProvider.boolType, _state.logicalNot()); + DartObjectImpl logicalNot(TypeSystemImpl typeSystem) { + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.boolType, + _state.logicalNot(), + ); + } /// Return the result of invoking the '>>>' operator on this object - /// with the [rightOperand]. The [typeProvider] is the type provider used to - /// find known types. + /// with the [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl logicalShiftRight( - TypeProvider typeProvider, DartObjectImpl rightOperand) => - DartObjectImpl( - typeProvider.intType, _state.logicalShiftRight(rightOperand._state)); + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.intType, + _state.logicalShiftRight(rightOperand._state), + ); + } /// Return the result of invoking the '-' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. - DartObjectImpl minus(TypeProvider typeProvider, DartObjectImpl rightOperand) { + DartObjectImpl minus(TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { InstanceState result = _state.minus(rightOperand._state); if (result is IntState) { - return DartObjectImpl(typeProvider.intType, result); + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.intType, + result, + ); } else if (result is DoubleState) { - return DartObjectImpl(typeProvider.doubleType, result); + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.doubleType, + result, + ); } // We should never get here. throw StateError("minus returned a ${result.runtimeType}"); } - /// Return the result of invoking the '-' operator on this object. The - /// [typeProvider] is the type provider used to find known types. + /// Return the result of invoking the '-' operator on this object. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. - DartObjectImpl negated(TypeProvider typeProvider) { + DartObjectImpl negated(TypeSystemImpl typeSystem) { InstanceState result = _state.negated(); if (result is IntState) { - return DartObjectImpl(typeProvider.intType, result); + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.intType, + result, + ); } else if (result is DoubleState) { - return DartObjectImpl(typeProvider.doubleType, result); + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.doubleType, + result, + ); } // We should never get here. throw StateError("negated returned a ${result.runtimeType}"); } /// Return the result of invoking the '!=' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl notEqual( - TypeProvider typeProvider, DartObjectImpl rightOperand) { - return equalEqual(typeProvider, rightOperand).logicalNot(typeProvider); + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { + return equalEqual(typeSystem, rightOperand).logicalNot(typeSystem); } - /// Return the result of converting this object to a 'String'. The - /// [typeProvider] is the type provider used to find known types. + /// Return the result of converting this object to a 'String'. /// /// Throws an [EvaluationException] if the object cannot be converted to a /// 'String'. - DartObjectImpl performToString(TypeProvider typeProvider) { - InterfaceType stringType = typeProvider.stringType; + DartObjectImpl performToString(TypeSystemImpl typeSystem) { + InterfaceType stringType = typeSystem.typeProvider.stringType; if (identical(type, stringType)) { return this; } - return DartObjectImpl(stringType, _state.convertToString()); + return DartObjectImpl(typeSystem, stringType, _state.convertToString()); } /// Return the result of invoking the '%' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl remainder( - TypeProvider typeProvider, DartObjectImpl rightOperand) { + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { InstanceState result = _state.remainder(rightOperand._state); if (result is IntState) { - return DartObjectImpl(typeProvider.intType, result); + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.intType, + result, + ); } else if (result is DoubleState) { - return DartObjectImpl(typeProvider.doubleType, result); + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.doubleType, + result, + ); } // We should never get here. throw StateError("remainder returned a ${result.runtimeType}"); } /// Return the result of invoking the '<<' operator on this object with - /// the [rightOperand]. The [typeProvider] is the type provider used to find - /// known types. + /// the [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl shiftLeft( - TypeProvider typeProvider, DartObjectImpl rightOperand) => - DartObjectImpl( - typeProvider.intType, _state.shiftLeft(rightOperand._state)); + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.intType, + _state.shiftLeft(rightOperand._state), + ); + } /// Return the result of invoking the '>>' operator on this object with - /// the [rightOperand]. The [typeProvider] is the type provider used to find - /// known types. + /// the [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. DartObjectImpl shiftRight( - TypeProvider typeProvider, DartObjectImpl rightOperand) => - DartObjectImpl( - typeProvider.intType, _state.shiftRight(rightOperand._state)); + TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.intType, + _state.shiftRight(rightOperand._state), + ); + } - /// Return the result of invoking the 'length' getter on this object. The - /// [typeProvider] is the type provider used to find known types. + /// Return the result of invoking the 'length' getter on this object. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. - DartObjectImpl stringLength(TypeProvider typeProvider) => - DartObjectImpl(typeProvider.intType, _state.stringLength()); + DartObjectImpl stringLength(TypeSystemImpl typeSystem) { + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.intType, + _state.stringLength(), + ); + } /// Return the result of invoking the '*' operator on this object with the - /// [rightOperand]. The [typeProvider] is the type provider used to find known - /// types. + /// [rightOperand]. /// /// Throws an [EvaluationException] if the operator is not appropriate for an /// object of this kind. - DartObjectImpl times(TypeProvider typeProvider, DartObjectImpl rightOperand) { + DartObjectImpl times(TypeSystemImpl typeSystem, DartObjectImpl rightOperand) { InstanceState result = _state.times(rightOperand._state); if (result is IntState) { - return DartObjectImpl(typeProvider.intType, result); + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.intType, + result, + ); } else if (result is DoubleState) { - return DartObjectImpl(typeProvider.doubleType, result); + return DartObjectImpl( + typeSystem, + typeSystem.typeProvider.doubleType, + result, + ); } // We should never get here. throw StateError("times returned a ${result.runtimeType}"); diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart index 0e7569596fa..cd413227171 100644 --- a/pkg/analyzer/lib/src/dart/element/element.dart +++ b/pkg/analyzer/lib/src/dart/element/element.dart @@ -1824,9 +1824,17 @@ class ConstFieldElementImpl_EnumValue extends ConstFieldElementImpl_ofEnum { EvaluationResultImpl get evaluationResult { if (_evaluationResult == null) { Map fieldMap = { - name: DartObjectImpl(library.typeProvider.intType, IntState(_index)) + name: DartObjectImpl( + library.typeSystem, + library.typeProvider.intType, + IntState(_index), + ) }; - DartObjectImpl value = DartObjectImpl(type, GenericState(fieldMap)); + DartObjectImpl value = DartObjectImpl( + library.typeSystem, + type, + GenericState(fieldMap), + ); _evaluationResult = EvaluationResultImpl(value); } return _evaluationResult; @@ -1868,8 +1876,13 @@ class ConstFieldElementImpl_EnumValues extends ConstFieldElementImpl_ofEnum { constantValues.add(field.evaluationResult.value); } } - _evaluationResult = - EvaluationResultImpl(DartObjectImpl(type, ListState(constantValues))); + _evaluationResult = EvaluationResultImpl( + DartObjectImpl( + library.typeSystem, + type, + ListState(constantValues), + ), + ); } return _evaluationResult; } diff --git a/pkg/analyzer/lib/src/dart/element/type_provider.dart b/pkg/analyzer/lib/src/dart/element/type_provider.dart index 40524cfd076..0d1515268a9 100644 --- a/pkg/analyzer/lib/src/dart/element/type_provider.dart +++ b/pkg/analyzer/lib/src/dart/element/type_provider.dart @@ -8,6 +8,7 @@ import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; import 'package:analyzer/src/dart/constant/value.dart'; import 'package:analyzer/src/dart/element/type.dart'; +import 'package:analyzer/src/generated/type_system.dart'; import 'package:meta/meta.dart'; /// Provide common functionality shared by the various TypeProvider @@ -363,10 +364,20 @@ class TypeProviderImpl extends TypeProviderBase { return _nullElement ??= _getClassElement(_coreLibrary, 'Null'); } + @deprecated @override DartObjectImpl get nullObject { if (_nullObject == null) { - _nullObject = DartObjectImpl(nullType, NullState.NULL_STATE); + _nullObject = DartObjectImpl( + TypeSystemImpl( + implicitCasts: false, + isNonNullableByDefault: false, + strictInference: false, + typeProvider: this, + ), + nullType, + NullState.NULL_STATE, + ); } return _nullObject; } diff --git a/pkg/analyzer/lib/src/error/dead_code_verifier.dart b/pkg/analyzer/lib/src/error/dead_code_verifier.dart index ca5e9f7d8cb..98834a12575 100644 --- a/pkg/analyzer/lib/src/error/dead_code_verifier.dart +++ b/pkg/analyzer/lib/src/error/dead_code_verifier.dart @@ -448,12 +448,13 @@ class DeadCodeVerifier extends RecursiveAstVisitor { /// is not a constant boolean value. EvaluationResultImpl _getConstantBooleanValue(Expression expression) { if (expression is BooleanLiteral) { - if (expression.value) { - return EvaluationResultImpl(DartObjectImpl(null, BoolState.from(true))); - } else { - return EvaluationResultImpl( - DartObjectImpl(null, BoolState.from(false))); - } + return EvaluationResultImpl( + DartObjectImpl( + _typeSystem, + _typeSystem.typeProvider.boolType, + BoolState.from(expression.value), + ), + ); } // Don't consider situations where we could evaluate to a constant boolean diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart index f63784d9332..2fe0eb0a27e 100644 --- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart +++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart @@ -18,6 +18,7 @@ import 'package:analyzer/src/generated/constant.dart'; import 'package:analyzer/src/generated/engine.dart'; import 'package:analyzer/src/generated/source.dart'; import 'package:analyzer/src/generated/testing/ast_test_factory.dart'; +import 'package:analyzer/src/generated/type_system.dart'; import 'package:analyzer/src/generated/utilities_dart.dart'; import 'package:meta/meta.dart'; import 'package:path/path.dart'; @@ -153,8 +154,15 @@ class ElementFactory { [List argumentTypes]) => constructorElement(definingClass, name, false, argumentTypes); + @deprecated static EnumElementImpl enumElement(TypeProvider typeProvider, String enumName, [List constantNames]) { + var typeSystem = TypeSystemImpl( + implicitCasts: false, + isNonNullableByDefault: false, + strictInference: false, + typeProvider: typeProvider, + ); // // Build the enum. // @@ -198,10 +206,12 @@ class ElementFactory { constantElement.type = enumType; Map fieldMap = HashMap(); - fieldMap[indexFieldName] = DartObjectImpl(intType, IntState(i)); + fieldMap[indexFieldName] = + DartObjectImpl(typeSystem, intType, IntState(i)); fieldMap[nameFieldName] = - DartObjectImpl(stringType, StringState(constantName)); - DartObjectImpl value = DartObjectImpl(enumType, GenericState(fieldMap)); + DartObjectImpl(typeSystem, stringType, StringState(constantName)); + DartObjectImpl value = + DartObjectImpl(typeSystem, enumType, GenericState(fieldMap)); constantElement.evaluationResult = EvaluationResultImpl(value); fields.add(constantElement); } diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart index c81f36c0784..ccd0f72ce2c 100644 --- a/pkg/analyzer/lib/src/lint/linter.dart +++ b/pkg/analyzer/lib/src/lint/linter.dart @@ -441,7 +441,6 @@ class LinterContextImpl implements LinterContext { ConstantVerifier( errorReporter, libraryElement, - typeProvider, declaredVariables, featureSet: currentUnit.unit.featureSet, ), diff --git a/pkg/analyzer/test/dart/analysis/declared_variables_test.dart b/pkg/analyzer/test/dart/analysis/declared_variables_test.dart deleted file mode 100644 index 0bdd53770d6..00000000000 --- a/pkg/analyzer/test/dart/analysis/declared_variables_test.dart +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) 2016, 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. - -import 'package:analyzer/dart/analysis/declared_variables.dart'; -import 'package:analyzer/dart/element/type.dart'; -import 'package:analyzer/src/generated/constant.dart'; -import 'package:analyzer/src/generated/testing/test_type_provider.dart'; -import 'package:test/test.dart'; -import 'package:test_reflective_loader/test_reflective_loader.dart'; - -main() { - defineReflectiveSuite(() { - defineReflectiveTests(DeclaredVariablesTest); - }); -} - -@reflectiveTest -class DeclaredVariablesTest { - void test_getBool_false() { - TestTypeProvider typeProvider = TestTypeProvider(); - String variableName = "var"; - DeclaredVariables variables = - DeclaredVariables.fromMap({variableName: 'false'}); - DartObject object = variables.getBool(typeProvider, variableName); - expect(object, isNotNull); - expect(object.toBoolValue(), false); - } - - void test_getBool_invalid() { - TestTypeProvider typeProvider = TestTypeProvider(); - String variableName = "var"; - DeclaredVariables variables = - DeclaredVariables.fromMap({variableName: 'not true'}); - _assertNullDartObject( - typeProvider, variables.getBool(typeProvider, variableName)); - } - - void test_getBool_true() { - TestTypeProvider typeProvider = TestTypeProvider(); - String variableName = "var"; - DeclaredVariables variables = - DeclaredVariables.fromMap({variableName: 'true'}); - DartObject object = variables.getBool(typeProvider, variableName); - expect(object, isNotNull); - expect(object.toBoolValue(), true); - } - - void test_getBool_undefined() { - TestTypeProvider typeProvider = TestTypeProvider(); - String variableName = "var"; - DeclaredVariables variables = DeclaredVariables(); - _assertUnknownDartObject( - typeProvider.boolType, variables.getBool(typeProvider, variableName)); - } - - void test_getInt_invalid() { - TestTypeProvider typeProvider = TestTypeProvider(); - String variableName = "var"; - DeclaredVariables variables = - DeclaredVariables.fromMap({variableName: 'four score and seven years'}); - _assertNullDartObject( - typeProvider, variables.getInt(typeProvider, variableName)); - } - - void test_getInt_undefined() { - TestTypeProvider typeProvider = TestTypeProvider(); - String variableName = "var"; - DeclaredVariables variables = DeclaredVariables(); - _assertUnknownDartObject( - typeProvider.intType, variables.getInt(typeProvider, variableName)); - } - - void test_getInt_valid() { - TestTypeProvider typeProvider = TestTypeProvider(); - String variableName = "var"; - DeclaredVariables variables = - DeclaredVariables.fromMap({variableName: '23'}); - DartObject object = variables.getInt(typeProvider, variableName); - expect(object, isNotNull); - expect(object.toIntValue(), 23); - } - - void test_getString_defined() { - TestTypeProvider typeProvider = TestTypeProvider(); - String variableName = "var"; - String value = "value"; - DeclaredVariables variables = - DeclaredVariables.fromMap({variableName: value}); - DartObject object = variables.getString(typeProvider, variableName); - expect(object, isNotNull); - expect(object.toStringValue(), value); - } - - void test_getString_undefined() { - TestTypeProvider typeProvider = TestTypeProvider(); - String variableName = "var"; - DeclaredVariables variables = DeclaredVariables(); - _assertUnknownDartObject(typeProvider.stringType, - variables.getString(typeProvider, variableName)); - } - - void _assertNullDartObject(TestTypeProvider typeProvider, DartObject result) { - expect(result.type, typeProvider.nullType); - } - - void _assertUnknownDartObject(DartType expectedType, DartObject result) { - expect((result as DartObjectImpl).isUnknown, isTrue); - expect(result.type, expectedType); - } -} diff --git a/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart b/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart new file mode 100644 index 00000000000..3204b5605a6 --- /dev/null +++ b/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart @@ -0,0 +1,144 @@ +// Copyright (c) 2016, 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. + +import 'package:analyzer/dart/analysis/declared_variables.dart'; +import 'package:analyzer/dart/element/type.dart'; +import 'package:analyzer/dart/element/type_provider.dart'; +import 'package:analyzer/src/dart/constant/from_environment_evaluator.dart'; +import 'package:analyzer/src/generated/constant.dart'; +import 'package:analyzer/src/generated/type_system.dart'; +import 'package:test/test.dart'; +import 'package:test_reflective_loader/test_reflective_loader.dart'; + +import '../../generated/test_analysis_context.dart'; + +main() { + defineReflectiveSuite(() { + defineReflectiveTests(FromEnvironmentEvaluatorTest); + }); +} + +@reflectiveTest +class FromEnvironmentEvaluatorTest { + TypeProvider typeProvider; + TypeSystemImpl typeSystem; + + void setUp() { + var analysisContext = TestAnalysisContext(); + typeProvider = analysisContext.typeProviderLegacy; + typeSystem = analysisContext.typeSystemLegacy; + } + + void test_getBool_false() { + String variableName = "var"; + var variables = FromEnvironmentEvaluator( + typeSystem, + DeclaredVariables.fromMap({variableName: 'false'}), + ); + DartObject object = variables.getBool(variableName); + expect(object, isNotNull); + expect(object.toBoolValue(), false); + } + + void test_getBool_invalid() { + String variableName = "var"; + var variables = FromEnvironmentEvaluator( + typeSystem, + DeclaredVariables.fromMap({variableName: 'not true'}), + ); + _assertNullDartObject( + variables.getBool(variableName), + ); + } + + void test_getBool_true() { + String variableName = "var"; + var variables = FromEnvironmentEvaluator( + typeSystem, + DeclaredVariables.fromMap({variableName: 'true'}), + ); + DartObject object = variables.getBool(variableName); + expect(object, isNotNull); + expect(object.toBoolValue(), true); + } + + void test_getBool_undefined() { + String variableName = "var"; + var variables = FromEnvironmentEvaluator( + typeSystem, + DeclaredVariables(), + ); + _assertUnknownDartObject( + typeProvider.boolType, + variables.getBool(variableName), + ); + } + + void test_getInt_invalid() { + String variableName = "var"; + var variables = FromEnvironmentEvaluator( + typeSystem, + DeclaredVariables.fromMap({variableName: 'four score and seven years'}), + ); + _assertNullDartObject( + variables.getInt(variableName), + ); + } + + void test_getInt_undefined() { + String variableName = "var"; + var variables = FromEnvironmentEvaluator( + typeSystem, + DeclaredVariables(), + ); + _assertUnknownDartObject( + typeProvider.intType, + variables.getInt(variableName), + ); + } + + void test_getInt_valid() { + String variableName = "var"; + var variables = FromEnvironmentEvaluator( + typeSystem, + DeclaredVariables.fromMap({variableName: '23'}), + ); + DartObject object = variables.getInt(variableName); + expect(object, isNotNull); + expect(object.toIntValue(), 23); + } + + void test_getString_defined() { + String variableName = "var"; + String value = "value"; + var variables = FromEnvironmentEvaluator( + typeSystem, + DeclaredVariables.fromMap({variableName: value}), + ); + DartObject object = variables.getString(variableName); + expect(object, isNotNull); + expect(object.toStringValue(), value); + } + + void test_getString_undefined() { + String variableName = "var"; + var variables = FromEnvironmentEvaluator( + typeSystem, + DeclaredVariables(), + ); + _assertUnknownDartObject( + typeProvider.stringType, + variables.getString(variableName), + ); + } + + void _assertNullDartObject(DartObject result) { + expect(result.type, typeProvider.nullType); + } + + void _assertUnknownDartObject(DartType expectedType, DartObject result) { + expect((result as DartObjectImpl).isUnknown, isTrue); + expect(result.type, expectedType); + } +} diff --git a/pkg/analyzer/test/dart/analysis/test_all.dart b/pkg/analyzer/test/dart/analysis/test_all.dart index 44f950bc17b..a7e9797b711 100644 --- a/pkg/analyzer/test/dart/analysis/test_all.dart +++ b/pkg/analyzer/test/dart/analysis/test_all.dart @@ -4,7 +4,7 @@ import 'package:test_reflective_loader/test_reflective_loader.dart'; -import 'declared_variables_test.dart' as declared_variables; +import 'from_environment_evaluator_test.dart' as declared_variables; import 'utilities_test.dart' as utilities; main() { diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart index 5deef1f370d..ad07280b69f 100644 --- a/pkg/analyzer/test/generated/element_resolver_test.dart +++ b/pkg/analyzer/test/generated/element_resolver_test.dart @@ -555,27 +555,6 @@ class ElementResolverTest with ResourceProviderMixin, ElementsTypesMixin { _listener.assertNoErrors(); } - test_visitEnumDeclaration() async { - CompilationUnitElementImpl compilationUnitElement = - ElementFactory.compilationUnit('foo.dart'); - EnumElementImpl enumElement = - ElementFactory.enumElement(_typeProvider, ('E')); - compilationUnitElement.enums = [enumElement]; - EnumDeclaration enumNode = AstTestFactory.enumDeclaration2('E', []); - Annotation annotationNode = - AstTestFactory.annotation(AstTestFactory.identifier3('a')); - annotationNode.element = ElementFactory.classElement2('A'); - annotationNode.elementAnnotation = - ElementAnnotationImpl(compilationUnitElement); - enumNode.metadata.add(annotationNode); - enumNode.name.staticElement = enumElement; - List metadata = [ - annotationNode.elementAnnotation - ]; - _resolveNode(enumNode); - expect(metadata[0].element, annotationNode.element); - } - test_visitExportDirective_noCombinators() async { ExportDirective directive = AstTestFactory.exportDirective2(null); directive.element = ElementFactory.exportFor( diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart index 98545640218..640f48277ad 100644 --- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart +++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart @@ -159,7 +159,7 @@ const a = dynamic; const a = b; const b = 3;'''); var environment = { - 'b': DartObjectImpl(typeProvider.intType, IntState(6)), + 'b': DartObjectImpl(typeSystem, typeProvider.intType, IntState(6)), }; var result = _evaluateConstant('a', lexicalEnvironment: environment); expect(result.type, typeProvider.intType); @@ -171,7 +171,7 @@ const b = 3;'''); const a = b; const b = 3;'''); var environment = { - 'c': DartObjectImpl(typeProvider.intType, IntState(6)), + 'c': DartObjectImpl(typeSystem, typeProvider.intType, IntState(6)), }; var result = _evaluateConstant('a', lexicalEnvironment: environment); expect(result.type, typeProvider.intType); diff --git a/pkg/analyzer/test/src/dart/constant/value_test.dart b/pkg/analyzer/test/src/dart/constant/value_test.dart index a1910d2cfb5..6018be71f6f 100644 --- a/pkg/analyzer/test/src/dart/constant/value_test.dart +++ b/pkg/analyzer/test/src/dart/constant/value_test.dart @@ -5,10 +5,12 @@ import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; import 'package:analyzer/src/generated/constant.dart'; -import 'package:analyzer/src/generated/testing/test_type_provider.dart'; +import 'package:analyzer/src/generated/type_system.dart'; import 'package:test/test.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; +import '../../../generated/test_analysis_context.dart'; + main() { defineReflectiveSuite(() { defineReflectiveTests(DartObjectImplTest); @@ -22,7 +24,14 @@ final Matcher throwsEvaluationException = @reflectiveTest class DartObjectImplTest { - final TypeProvider _typeProvider = TestTypeProvider(); + TypeProvider _typeProvider; + TypeSystemImpl _typeSystem; + + void setUp() { + var analysisContext = TestAnalysisContext(); + _typeProvider = analysisContext.typeProviderLegacy; + _typeSystem = analysisContext.typeSystemLegacy; + } void test_add_knownDouble_knownDouble() { _assertAdd(_doubleValue(3.0), _doubleValue(1.0), _doubleValue(2.0)); @@ -1360,8 +1369,15 @@ class DartObjectImplTest { } void test_shiftLeft_knownInt_tooLarge() { - _assertShiftLeft(_intValue(null), _intValue(6), - DartObjectImpl(_typeProvider.intType, IntState(LONG_MAX_VALUE))); + _assertShiftLeft( + _intValue(null), + _intValue(6), + DartObjectImpl( + _typeSystem, + _typeProvider.intType, + IntState(LONG_MAX_VALUE), + ), + ); } void test_shiftLeft_knownInt_unknownInt() { @@ -1393,8 +1409,15 @@ class DartObjectImplTest { } void test_shiftRight_knownInt_tooLarge() { - _assertShiftRight(_intValue(null), _intValue(48), - DartObjectImpl(_typeProvider.intType, IntState(LONG_MAX_VALUE))); + _assertShiftRight( + _intValue(null), + _intValue(48), + DartObjectImpl( + _typeSystem, + _typeProvider.intType, + IntState(LONG_MAX_VALUE), + ), + ); } void test_shiftRight_knownInt_unknownInt() { @@ -1488,10 +1511,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.add(_typeProvider, right); + left.add(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.add(_typeProvider, right); + DartObjectImpl result = left.add(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1504,10 +1527,10 @@ class DartObjectImplTest { void _assertBitNot(DartObjectImpl expected, DartObjectImpl operand) { if (expected == null) { expect(() { - operand.bitNot(_typeProvider); + operand.bitNot(_typeSystem); }, throwsEvaluationException); } else { - DartObjectImpl result = operand.bitNot(_typeProvider); + DartObjectImpl result = operand.bitNot(_typeSystem); expect(result, isNotNull); expect(result, expected); } @@ -1522,10 +1545,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.concatenate(_typeProvider, right); + left.concatenate(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.concatenate(_typeProvider, right); + DartObjectImpl result = left.concatenate(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1540,10 +1563,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.divide(_typeProvider, right); + left.divide(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.divide(_typeProvider, right); + DartObjectImpl result = left.divide(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1558,10 +1581,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.eagerAnd(_typeProvider, right, false); + left.eagerAnd(_typeSystem, right, false); }, throwsEvaluationException); } else { - DartObjectImpl result = left.eagerAnd(_typeProvider, right, false); + DartObjectImpl result = left.eagerAnd(_typeSystem, right, false); expect(result, isNotNull); expect(result, expected); } @@ -1576,10 +1599,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.eagerOr(_typeProvider, right, false); + left.eagerOr(_typeSystem, right, false); }, throwsEvaluationException); } else { - DartObjectImpl result = left.eagerOr(_typeProvider, right, false); + DartObjectImpl result = left.eagerOr(_typeSystem, right, false); expect(result, isNotNull); expect(result, expected); } @@ -1594,10 +1617,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.eagerXor(_typeProvider, right, false); + left.eagerXor(_typeSystem, right, false); }, throwsEvaluationException); } else { - DartObjectImpl result = left.eagerXor(_typeProvider, right, false); + DartObjectImpl result = left.eagerXor(_typeSystem, right, false); expect(result, isNotNull); expect(result, expected); } @@ -1612,10 +1635,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.equalEqual(_typeProvider, right); + left.equalEqual(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.equalEqual(_typeProvider, right); + DartObjectImpl result = left.equalEqual(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1630,10 +1653,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.greaterThan(_typeProvider, right); + left.greaterThan(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.greaterThan(_typeProvider, right); + DartObjectImpl result = left.greaterThan(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1648,10 +1671,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.greaterThanOrEqual(_typeProvider, right); + left.greaterThanOrEqual(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.greaterThanOrEqual(_typeProvider, right); + DartObjectImpl result = left.greaterThanOrEqual(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1663,7 +1686,7 @@ class DartObjectImplTest { */ void _assertIdentical( DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { - DartObjectImpl result = left.isIdentical(_typeProvider, right); + DartObjectImpl result = left.isIdentical2(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1681,10 +1704,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.integerDivide(_typeProvider, right); + left.integerDivide(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.integerDivide(_typeProvider, right); + DartObjectImpl result = left.integerDivide(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1699,10 +1722,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.lazyAnd(_typeProvider, () => right); + left.lazyAnd(_typeSystem, () => right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.lazyAnd(_typeProvider, () => right); + DartObjectImpl result = left.lazyAnd(_typeSystem, () => right); expect(result, isNotNull); expect(result, expected); } @@ -1717,10 +1740,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.lazyOr(_typeProvider, () => right); + left.lazyOr(_typeSystem, () => right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.lazyOr(_typeProvider, () => right); + DartObjectImpl result = left.lazyOr(_typeSystem, () => right); expect(result, isNotNull); expect(result, expected); } @@ -1735,10 +1758,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.lessThan(_typeProvider, right); + left.lessThan(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.lessThan(_typeProvider, right); + DartObjectImpl result = left.lessThan(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1753,10 +1776,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.lessThanOrEqual(_typeProvider, right); + left.lessThanOrEqual(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.lessThanOrEqual(_typeProvider, right); + DartObjectImpl result = left.lessThanOrEqual(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1769,10 +1792,10 @@ class DartObjectImplTest { void _assertLogicalNot(DartObjectImpl expected, DartObjectImpl operand) { if (expected == null) { expect(() { - operand.logicalNot(_typeProvider); + operand.logicalNot(_typeSystem); }, throwsEvaluationException); } else { - DartObjectImpl result = operand.logicalNot(_typeProvider); + DartObjectImpl result = operand.logicalNot(_typeSystem); expect(result, isNotNull); expect(result, expected); } @@ -1787,10 +1810,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.minus(_typeProvider, right); + left.minus(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.minus(_typeProvider, right); + DartObjectImpl result = left.minus(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1803,10 +1826,10 @@ class DartObjectImplTest { void _assertNegated(DartObjectImpl expected, DartObjectImpl operand) { if (expected == null) { expect(() { - operand.negated(_typeProvider); + operand.negated(_typeSystem); }, throwsEvaluationException); } else { - DartObjectImpl result = operand.negated(_typeProvider); + DartObjectImpl result = operand.negated(_typeSystem); expect(result, isNotNull); expect(result, expected); } @@ -1821,10 +1844,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.notEqual(_typeProvider, right); + left.notEqual(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.notEqual(_typeProvider, right); + DartObjectImpl result = left.notEqual(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1837,10 +1860,10 @@ class DartObjectImplTest { void _assertPerformToString(DartObjectImpl expected, DartObjectImpl operand) { if (expected == null) { expect(() { - operand.performToString(_typeProvider); + operand.performToString(_typeSystem); }, throwsEvaluationException); } else { - DartObjectImpl result = operand.performToString(_typeProvider); + DartObjectImpl result = operand.performToString(_typeSystem); expect(result, isNotNull); expect(result, expected); } @@ -1855,10 +1878,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.remainder(_typeProvider, right); + left.remainder(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.remainder(_typeProvider, right); + DartObjectImpl result = left.remainder(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1873,10 +1896,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.shiftLeft(_typeProvider, right); + left.shiftLeft(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.shiftLeft(_typeProvider, right); + DartObjectImpl result = left.shiftLeft(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1891,10 +1914,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.shiftRight(_typeProvider, right); + left.shiftRight(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.shiftRight(_typeProvider, right); + DartObjectImpl result = left.shiftRight(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1907,10 +1930,10 @@ class DartObjectImplTest { void _assertStringLength(DartObjectImpl expected, DartObjectImpl operand) { if (expected == null) { expect(() { - operand.stringLength(_typeProvider); + operand.stringLength(_typeSystem); }, throwsEvaluationException); } else { - DartObjectImpl result = operand.stringLength(_typeProvider); + DartObjectImpl result = operand.stringLength(_typeSystem); expect(result, isNotNull); expect(result, expected); } @@ -1925,10 +1948,10 @@ class DartObjectImplTest { DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) { if (expected == null) { expect(() { - left.times(_typeProvider, right); + left.times(_typeSystem, right); }, throwsEvaluationException); } else { - DartObjectImpl result = left.times(_typeProvider, right); + DartObjectImpl result = left.times(_typeSystem, right); expect(result, isNotNull); expect(result, expected); } @@ -1936,11 +1959,23 @@ class DartObjectImplTest { DartObjectImpl _boolValue(bool value) { if (value == null) { - return DartObjectImpl(_typeProvider.boolType, BoolState.UNKNOWN_VALUE); + return DartObjectImpl( + _typeSystem, + _typeProvider.boolType, + BoolState.UNKNOWN_VALUE, + ); } else if (identical(value, false)) { - return DartObjectImpl(_typeProvider.boolType, BoolState.FALSE_STATE); + return DartObjectImpl( + _typeSystem, + _typeProvider.boolType, + BoolState.FALSE_STATE, + ); } else if (identical(value, true)) { - return DartObjectImpl(_typeProvider.boolType, BoolState.TRUE_STATE); + return DartObjectImpl( + _typeSystem, + _typeProvider.boolType, + BoolState.TRUE_STATE, + ); } fail("Invalid boolean value used in test"); } @@ -1948,17 +1983,32 @@ class DartObjectImplTest { DartObjectImpl _doubleValue(double value) { if (value == null) { return DartObjectImpl( - _typeProvider.doubleType, DoubleState.UNKNOWN_VALUE); + _typeSystem, + _typeProvider.doubleType, + DoubleState.UNKNOWN_VALUE, + ); } else { - return DartObjectImpl(_typeProvider.doubleType, DoubleState(value)); + return DartObjectImpl( + _typeSystem, + _typeProvider.doubleType, + DoubleState(value), + ); } } DartObjectImpl _intValue(int value) { if (value == null) { - return DartObjectImpl(_typeProvider.intType, IntState.UNKNOWN_VALUE); + return DartObjectImpl( + _typeSystem, + _typeProvider.intType, + IntState.UNKNOWN_VALUE, + ); } else { - return DartObjectImpl(_typeProvider.intType, IntState(value)); + return DartObjectImpl( + _typeSystem, + _typeProvider.intType, + IntState(value), + ); } } @@ -1967,6 +2017,7 @@ class DartObjectImplTest { List elements, ) { return DartObjectImpl( + _typeSystem, _typeProvider.listType2(elementType), ListState(elements), ); @@ -1981,29 +2032,49 @@ class DartObjectImplTest { map[keyElementPairs[i++]] = keyElementPairs[i++]; } return DartObjectImpl( + _typeSystem, _typeProvider.mapType2(keyType, valueType), MapState(map), ); } DartObjectImpl _nullValue() { - return DartObjectImpl(_typeProvider.nullType, NullState.NULL_STATE); + return DartObjectImpl( + _typeSystem, + _typeProvider.nullType, + NullState.NULL_STATE, + ); } DartObjectImpl _setValue(DartType type, Set elements) { - return DartObjectImpl(type, SetState(elements ?? {})); + return DartObjectImpl( + _typeSystem, + type, + SetState(elements ?? {}), + ); } DartObjectImpl _stringValue(String value) { if (value == null) { return DartObjectImpl( - _typeProvider.stringType, StringState.UNKNOWN_VALUE); + _typeSystem, + _typeProvider.stringType, + StringState.UNKNOWN_VALUE, + ); } else { - return DartObjectImpl(_typeProvider.stringType, StringState(value)); + return DartObjectImpl( + _typeSystem, + _typeProvider.stringType, + StringState(value), + ); } } DartObjectImpl _symbolValue(String value) { - return DartObjectImpl(_typeProvider.symbolType, SymbolState(value)); + return DartObjectImpl( + _typeSystem, + _typeProvider.symbolType, + SymbolState(value), + ); } } diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart index a1ed2a6c2d4..32d8e112e47 100644 --- a/pkg/analyzer/test/src/dart/element/element_test.dart +++ b/pkg/analyzer/test/src/dart/element/element_test.dart @@ -223,20 +223,6 @@ class ClassElementImplTest extends AbstractTypeTest { expect(classA.hasStaticMember, isTrue); } - void test_isEnum() { - String firstConst = "A"; - String secondConst = "B"; - EnumElementImpl enumE = ElementFactory.enumElement( - TestTypeProvider(), "E", [firstConst, secondConst]); - - // E is an enum - expect(enumE.isEnum, true); - - // A and B are static members - expect(enumE.getField(firstConst).isEnumConstant, true); - expect(enumE.getField(secondConst).isEnumConstant, true); - } - void test_lookUpConcreteMethod_declared() { // class A { // m() {} @@ -867,28 +853,6 @@ class ClassElementImplTest extends AbstractTypeTest { @reflectiveTest class CompilationUnitElementImplTest { - void test_getEnum_declared() { - TestTypeProvider typeProvider = TestTypeProvider(); - CompilationUnitElementImpl unit = - ElementFactory.compilationUnit("/lib.dart"); - String enumName = "E"; - ClassElement enumElement = - ElementFactory.enumElement(typeProvider, enumName); - unit.enums = [enumElement]; - expect(unit.getEnum(enumName), same(enumElement)); - } - - void test_getEnum_undeclared() { - TestTypeProvider typeProvider = TestTypeProvider(); - CompilationUnitElementImpl unit = - ElementFactory.compilationUnit("/lib.dart"); - String enumName = "E"; - ClassElement enumElement = - ElementFactory.enumElement(typeProvider, enumName); - unit.enums = [enumElement]; - expect(unit.getEnum("${enumName}x"), isNull); - } - void test_getType_declared() { CompilationUnitElementImpl unit = ElementFactory.compilationUnit("/lib.dart"); diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart index 459660e5b91..73c651d81ff 100644 --- a/pkg/analyzer/test/src/dart/resolution/resolution.dart +++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart @@ -17,6 +17,7 @@ import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/dart/element/member.dart'; import 'package:analyzer/src/dart/element/type.dart'; import 'package:analyzer/src/dart/element/type_algebra.dart'; +import 'package:analyzer/src/generated/type_system.dart'; import 'package:analyzer/src/test_utilities/find_element.dart'; import 'package:analyzer/src/test_utilities/find_node.dart'; import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart'; @@ -80,6 +81,8 @@ mixin ResolutionTest implements ResourceProviderMixin { TypeProvider get typeProvider => result.typeProvider; + TypeSystemImpl get typeSystem => result.typeSystem; + /// Whether `DartType.toString()` with nullability should be asked. bool get typeToStringWithNullability => false;