Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Unified Diff: pkg/analyzer/test/src/context/context_test.dart

Issue 2165383002: Fix for local function element identifiers. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/element.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/test/src/context/context_test.dart
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart
index 47b273c069b7609f82433f287b218e22b67e699b..faed064af2962282f4ceb1ee6afbdeb97b0447aa 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -3772,6 +3772,35 @@ class B {
expect(context.getErrors(b).errors, hasLength(0));
}
+ void test_sequence_reorder_localFunctions() {
+ Source a = addSource(
+ '/a.dart',
+ r'''
+f1() {
+ localFunction() {
+ const C = 1;
+ }
+}
+f2() {}
+''');
+ _performPendingAnalysisTasks();
+ // Update a.dart: reorder functions.
+ // This should not fail with FrozenHashCodeException, because identifiers
+ // of local elements should be relative to the enclosing top-level elements.
+ context.setContents(
+ a,
+ r'''
+f2() {}
+f1() {
+ localFunction() {
+ const C = 1;
+ }
+}
+''');
+ _assertValidForChangedLibrary(a);
+ _assertInvalid(a, LIBRARY_ERRORS_READY);
+ }
+
void test_sequence_unitConstants() {
Source a = addSource(
'/a.dart',
@@ -3779,38 +3808,64 @@ class B {
const A = 1;
const B = 2;
const C = 3;
+foo() {
+ const V1 = 10;
+}
+bar() {
+ const V2 = 20;
+}
''');
_performPendingAnalysisTasks();
LibrarySpecificUnit unitA = new LibrarySpecificUnit(a, a);
- expect(context.getResult(unitA, COMPILATION_UNIT_CONSTANTS), hasLength(3));
- // Update and
+ List<ConstantEvaluationTarget> oldConstants =
+ context.getResult(unitA, COMPILATION_UNIT_CONSTANTS);
+ expect(oldConstants, hasLength(5));
+ ConstVariableElement oldA = _findConstVariable(oldConstants, 'A');
+ ConstVariableElement oldB = _findConstVariable(oldConstants, 'B');
+ ConstVariableElement oldC = _findConstVariable(oldConstants, 'C');
+ ConstVariableElement oldV1 = _findConstVariable(oldConstants, 'V1');
+ ConstVariableElement oldV2 = _findConstVariable(oldConstants, 'V2');
+ expect(context.analysisCache.get(oldA), isNotNull);
+ expect(context.analysisCache.get(oldB), isNotNull);
+ expect(context.analysisCache.get(oldC), isNotNull);
+ expect(context.analysisCache.get(oldV1), isNotNull);
+ // Update and validate new constants.
context.setContents(
a,
r'''
const A = 1;
const B = 2;
const D = 4;
-main() {
- const V = 42;
+foo() {
+ const V1 = 10;
+}
+baz() {
+ const V3 = 30;
}
''');
- List<ConstantEvaluationTarget> constants =
+ List<ConstantEvaluationTarget> newConstants =
context.getResult(unitA, COMPILATION_UNIT_CONSTANTS);
- expect(constants, hasLength(4));
+ expect(newConstants, hasLength(5));
+ expect(newConstants, contains(same(oldA)));
+ expect(newConstants, contains(same(oldB)));
+ expect(newConstants, contains(same(oldV1)));
+ ConstVariableElement newD = _findConstVariable(newConstants, 'D');
+ ConstVariableElement newV3 = _findConstVariable(newConstants, 'V3');
// Perform analysis, compute constant values.
_performPendingAnalysisTasks();
// Validate const variable values.
- Map<String, ConstVariableElement> constVariables =
- <String, ConstVariableElement>{};
- constants.forEach((c) {
- if (c is ConstVariableElement) {
- constVariables[c.name] = c;
- }
- });
- expect(constVariables['A'].evaluationResult.value.toIntValue(), 1);
- expect(constVariables['B'].evaluationResult.value.toIntValue(), 2);
- expect(constVariables['D'].evaluationResult.value.toIntValue(), 4);
- expect(constVariables['V'].evaluationResult.value.toIntValue(), 42);
+ expect(context.analysisCache.get(oldA), isNotNull);
+ expect(context.analysisCache.get(oldB), isNotNull);
+ expect(context.analysisCache.get(oldV1), isNotNull);
+ expect(context.analysisCache.get(oldC), isNull);
+ expect(context.analysisCache.get(oldV2), isNull);
+ expect(context.analysisCache.get(newD), isNotNull);
+ expect(context.analysisCache.get(newV3), isNotNull);
+ expect(oldA.evaluationResult.value.toIntValue(), 1);
+ expect(oldB.evaluationResult.value.toIntValue(), 2);
+ expect(newD.evaluationResult.value.toIntValue(), 4);
+ expect(oldV1.evaluationResult.value.toIntValue(), 10);
+ expect(newV3.evaluationResult.value.toIntValue(), 30);
}
void test_sequence_useAnyResolvedUnit() {
@@ -4289,6 +4344,13 @@ class A {
}
}
+ ConstVariableElement _findConstVariable(
+ List<ConstantEvaluationTarget> constants, String name) {
+ return constants.singleWhere((c) {
+ return c is ConstVariableElement && c.name == name;
+ });
+ }
+
void _performPendingAnalysisTasks([int maxTasks = 512]) {
for (int i = 0; context.performAnalysisTask().hasMoreWork; i++) {
if (i > maxTasks) {
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/element.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698