Skip to content

Commit 6c43390

Browse files
stereotype441commit-bot@chromium.org
authored andcommitted
Begin running the shared "ID tests" for constants on the analyzer.
This exposed an analyzer bug--see #37608. Change-Id: I96af785ce81ebb7b142b4f71cb43942b2b15f879 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/110123 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Paul Berry <[email protected]>
1 parent 2ada1ed commit 6c43390

File tree

7 files changed

+263
-62
lines changed

7 files changed

+263
-62
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'dart:io';
6+
7+
import 'package:analyzer/dart/ast/ast.dart';
8+
import 'package:analyzer/dart/constant/value.dart';
9+
import 'package:analyzer/dart/element/element.dart';
10+
import 'package:analyzer/dart/element/type.dart';
11+
import 'package:analyzer/src/util/ast_data_extractor.dart';
12+
import 'package:front_end/src/testing/id.dart' show ActualData, Id;
13+
import 'package:front_end/src/testing/id_testing.dart';
14+
15+
import '../util/id_testing_helper.dart';
16+
17+
main(List<String> args) async {
18+
Directory dataDir = new Directory.fromUri(
19+
Platform.script.resolve('../../../front_end/test/constants/data'));
20+
await runTests(dataDir,
21+
args: args,
22+
supportedMarkers: sharedMarkers,
23+
createUriForFileName: createUriForFileName,
24+
onFailure: onFailure,
25+
runTest: runTestFor(
26+
const ConstantsDataComputer(), [analyzerConstantUpdate2018Config]));
27+
}
28+
29+
class ConstantsDataComputer extends DataComputer<String> {
30+
const ConstantsDataComputer();
31+
32+
@override
33+
DataInterpreter<String> get dataValidator => const StringDataInterpreter();
34+
35+
@override
36+
void computeUnitData(
37+
CompilationUnit unit, Map<Id, ActualData<String>> actualMap) {
38+
ConstantsDataExtractor(unit.declaredElement.source.uri, actualMap)
39+
.run(unit);
40+
}
41+
}
42+
43+
class ConstantsDataExtractor extends AstDataExtractor<String> {
44+
ConstantsDataExtractor(Uri uri, Map<Id, ActualData<String>> actualMap)
45+
: super(uri, actualMap);
46+
47+
@override
48+
String computeNodeValue(Id id, AstNode node) {
49+
if (node is Identifier) {
50+
var element = node.staticElement;
51+
if (element is PropertyAccessorElement && element.isSynthetic) {
52+
var variable = element.variable;
53+
if (!variable.isSynthetic && variable.isConst) {
54+
var value = variable.constantValue;
55+
if (value != null) return _stringify(value);
56+
}
57+
}
58+
}
59+
return null;
60+
}
61+
62+
String _stringify(DartObject value) {
63+
var type = value.type;
64+
if (type is InterfaceType) {
65+
if (type.isDartCoreNull) return 'Null()';
66+
if (type.isDartCoreBool) return 'Bool(${value.toBoolValue()})';
67+
if (type.isDartCoreString) return 'String(${value.toStringValue()})';
68+
if (type.isDartCoreInt) return 'Int(${value.toIntValue()})';
69+
if (type.isDartCoreDouble) return 'Double(${value.toDoubleValue()})';
70+
if (type.isDartCoreSymbol) return 'Symbol(${value.toSymbolValue()})';
71+
if (type.isDartCoreSet) {
72+
var elements = value.toSetValue().map(_stringify).join(',');
73+
return 'Set<${type.typeArguments[0]}>($elements)';
74+
}
75+
if (type.isDartCoreList) {
76+
var elements = value.toListValue().map(_stringify).join(',');
77+
return 'List<${type.typeArguments[0]}>($elements)';
78+
}
79+
if (type.isDartCoreMap) {
80+
var typeArguments = type.typeArguments.join(',');
81+
var elements = value.toMapValue().entries.map((entry) {
82+
var key = _stringify(entry.key);
83+
var value = _stringify(entry.value);
84+
return '$key:$value';
85+
}).join(',');
86+
return 'Map<$typeArguments>($elements)';
87+
}
88+
} else if (type is FunctionType) {
89+
var element = value.toFunctionValue();
90+
return 'Function(${element.name})';
91+
}
92+
throw UnimplementedError('_stringify for type $type');
93+
}
94+
}

pkg/analyzer/test/src/dart/resolution/flow_analysis_test.dart

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,19 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'package:analyzer/dart/analysis/results.dart';
5+
import 'package:analyzer/dart/analysis/features.dart';
66
import 'package:analyzer/dart/ast/ast.dart';
77
import 'package:analyzer/dart/element/element.dart';
88
import 'package:analyzer/dart/element/type_system.dart';
9-
import 'package:analyzer/src/dart/analysis/experiments.dart';
109
import 'package:analyzer/src/dart/element/type.dart';
1110
import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
12-
import 'package:analyzer/src/generated/engine.dart';
1311
import 'package:analyzer/src/util/ast_data_extractor.dart';
1412
import 'package:front_end/src/testing/id.dart' show ActualData, Id;
1513
import 'package:front_end/src/testing/id_testing.dart' show DataInterpreter;
1614
import 'package:test/test.dart';
1715
import 'package:test_reflective_loader/test_reflective_loader.dart';
1816

1917
import '../../../util/id_testing_helper.dart';
20-
import 'driver_resolution.dart';
2118

2219
main() {
2320
defineReflectiveSuite(() {
@@ -26,32 +23,23 @@ main() {
2623
});
2724
}
2825

29-
class FlowTestBase extends DriverResolutionTest {
26+
class FlowTestBase {
3027
FlowAnalysisResult flowResult;
3128

3229
/// Resolve the given [code] and track nullability in the unit.
3330
Future<void> trackCode(String code) async {
3431
if (await checkTests(
35-
code, _computeResult, const _FlowAnalysisDataComputer())) {
32+
code,
33+
const _FlowAnalysisDataComputer(),
34+
FeatureSet.forTesting(
35+
sdkVersion: '2.2.2', additionalFeatures: [Feature.non_nullable]))) {
3636
fail('Failure(s)');
3737
}
3838
}
39-
40-
Future<ResolvedUnitResult> _computeResult(String code) async {
41-
addTestFile(code);
42-
await resolveTestFile();
43-
var unit = result.unit;
44-
flowResult = FlowAnalysisResult.getFromNode(unit);
45-
return result;
46-
}
4739
}
4840

4941
@reflectiveTest
5042
class NullableFlowTest extends FlowTestBase {
51-
@override
52-
AnalysisOptionsImpl get analysisOptions =>
53-
AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
54-
5543
test_assign_toNonNull() async {
5644
await trackCode(r'''
5745
void f(int? x) {
@@ -336,10 +324,6 @@ void f(int? x) {
336324

337325
@reflectiveTest
338326
class ReachableFlowTest extends FlowTestBase {
339-
@override
340-
AnalysisOptionsImpl get analysisOptions =>
341-
AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
342-
343327
test_conditional_false() async {
344328
await trackCode(r'''
345329
void f() {

pkg/analyzer/test/src/dart/resolution/type_promotion_test.dart

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,18 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'package:analyzer/dart/analysis/results.dart';
5+
import 'package:analyzer/dart/analysis/features.dart';
66
import 'package:analyzer/dart/ast/ast.dart';
77
import 'package:analyzer/dart/element/element.dart';
88
import 'package:analyzer/dart/element/type.dart';
9-
import 'package:analyzer/src/dart/analysis/experiments.dart';
109
import 'package:analyzer/src/dart/element/type.dart';
11-
import 'package:analyzer/src/generated/engine.dart';
1210
import 'package:analyzer/src/util/ast_data_extractor.dart';
1311
import 'package:front_end/src/testing/id.dart' show ActualData, Id;
1412
import 'package:front_end/src/testing/id_testing.dart' show DataInterpreter;
1513
import 'package:test/test.dart';
1614
import 'package:test_reflective_loader/test_reflective_loader.dart';
1715

1816
import '../../../util/id_testing_helper.dart';
19-
import 'driver_resolution.dart';
2017

2118
main() {
2219
defineReflectiveSuite(() {
@@ -25,14 +22,13 @@ main() {
2522
}
2623

2724
@reflectiveTest
28-
class TypePromotionTest extends DriverResolutionTest {
29-
@override
30-
AnalysisOptionsImpl get analysisOptions =>
31-
AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
32-
25+
class TypePromotionTest {
3326
Future<void> resolveCode(String code) async {
3427
if (await checkTests(
35-
code, _computeResult, const _TypePromotionDataComputer())) {
28+
code,
29+
const _TypePromotionDataComputer(),
30+
FeatureSet.forTesting(
31+
sdkVersion: '2.2.2', additionalFeatures: [Feature.non_nullable]))) {
3632
fail('Failure(s)');
3733
}
3834
}
@@ -730,12 +726,6 @@ void f(bool b, Object x) {
730726
}
731727
''');
732728
}
733-
734-
Future<ResolvedUnitResult> _computeResult(String code) async {
735-
addTestFile(code);
736-
await resolveTestFile();
737-
return result;
738-
}
739729
}
740730

741731
class _TypePromotionDataComputer extends DataComputer<DartType> {

0 commit comments

Comments
 (0)