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

Unified Diff: pkg/analyzer/test/src/summary/summary_common.dart

Issue 1691693002: Serialize local functions and variables. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Fixes for review comments. Created 4 years, 10 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/summary/summarize_elements.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/summary/summary_common.dart
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 364a2328a2c52721f40fdf06c2108ae1d7423407..820f1145d541c62dbf7cb28b3d0cd6302a2b74b9 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -2749,6 +2749,8 @@ class C<T> {
expect(executable.isRedirectedConstructor, isFalse);
expect(executable.redirectedConstructor, isNull);
expect(executable.redirectedConstructorName, isEmpty);
+ expect(executable.visibleOffset, 0);
+ expect(executable.visibleLength, 0);
}
test_constructor_anonymous() {
@@ -3511,6 +3513,8 @@ enum E { v }''';
expect(executable.returnType, isNull);
expect(executable.isExternal, isFalse);
expect(executable.nameOffset, text.indexOf('f'));
+ expect(executable.visibleOffset, 0);
+ expect(executable.visibleLength, 0);
expect(unlinkedUnits[0].publicNamespace.names, hasLength(1));
expect(unlinkedUnits[0].publicNamespace.names[0].kind,
ReferenceKind.topLevelFunction);
@@ -3572,12 +3576,194 @@ enum E { v }''';
expect(executable.parameters, isEmpty);
}
+ test_executable_localFunctions() {
+ String code = r'''
+f() { // 1
+ f1() {}
+ { // 2
+ f2() {}
+ } // 3
+} // 4
+''';
+ UnlinkedExecutable executable = serializeExecutableText(code);
+ List<UnlinkedExecutable> functions = executable.localFunctions;
+ expect(functions, hasLength(2));
+ {
+ UnlinkedExecutable f1 = functions.singleWhere((v) => v.name == 'f1');
+ _assertExecutableVisible(code, f1, '{ // 1', '} // 4');
+ }
+ {
+ UnlinkedExecutable f2 = functions.singleWhere((v) => v.name == 'f2');
+ _assertExecutableVisible(code, f2, '{ // 2', '} // 3');
+ }
+ }
+
+ test_executable_localVariables_empty() {
+ UnlinkedExecutable executable = serializeExecutableText(r'''
+f() {
+}
+''');
+ expect(executable.localVariables, isEmpty);
+ }
+
+ test_executable_localVariables_inConstructor() {
+ String code = r'''
+class C {
+ C() { // 1
+ int v;
+ } // 2
+}
+''';
+ UnlinkedExecutable executable =
+ findExecutable('', executables: serializeClassText(code).executables);
+ List<UnlinkedVariable> variables = executable.localVariables;
+ expect(variables, hasLength(1));
+ {
+ UnlinkedVariable v = variables.singleWhere((v) => v.name == 'v');
+ _assertVariableVisible(code, v, '{ // 1', '} // 2');
+ checkTypeRef(v.type, 'dart:core', 'dart:core', 'int');
+ }
+ }
+
+ test_executable_localVariables_inLocalFunctions() {
+ String code = r'''
+f() {
+ f1() { // 1
+ int v1 = 1;
+ } // 2
+ f2() { // 3
+ int v1 = 1;
+ f3() { // 4
+ int v2 = 1;
+ } // 5
+ } // 6
+} // 7
+''';
+ UnlinkedExecutable executable = serializeExecutableText(code);
+ List<UnlinkedExecutable> functions = executable.localFunctions;
+ expect(functions, hasLength(2));
+ // f - f1
+ {
+ UnlinkedExecutable f1 = functions.singleWhere((v) => v.name == 'f1');
+ List<UnlinkedVariable> variables = f1.localVariables;
+ expect(variables, hasLength(1));
+ // f1 - v1
+ UnlinkedVariable v1 = variables.singleWhere((v) => v.name == 'v1');
+ _assertVariableVisible(code, v1, '{ // 1', '} // 2');
+ checkTypeRef(v1.type, 'dart:core', 'dart:core', 'int');
+ }
+ // f - f2
+ {
+ UnlinkedExecutable f2 = functions.singleWhere((v) => v.name == 'f2');
+ List<UnlinkedVariable> variables2 = f2.localVariables;
+ List<UnlinkedExecutable> functions2 = f2.localFunctions;
+ expect(variables2, hasLength(1));
+ expect(functions2, hasLength(1));
+ // f - f2 - v1
+ UnlinkedVariable v1 = variables2.singleWhere((v) => v.name == 'v1');
+ _assertVariableVisible(code, v1, '{ // 3', '} // 6');
+ checkTypeRef(v1.type, 'dart:core', 'dart:core', 'int');
+ // f - f2 - f3
+ UnlinkedExecutable f3 = functions2.singleWhere((v) => v.name == 'f3');
+ _assertExecutableVisible(code, f3, '{ // 3', '} // 6');
+ List<UnlinkedVariable> variables3 = f3.localVariables;
+ List<UnlinkedExecutable> functions3 = f3.localFunctions;
+ expect(variables3, hasLength(1));
+ expect(functions3, hasLength(0));
+ // f - f3 - v2
+ UnlinkedVariable v2 = variables3.singleWhere((v) => v.name == 'v2');
+ _assertVariableVisible(code, v2, '{ // 4', '} // 5');
+ checkTypeRef(v2.type, 'dart:core', 'dart:core', 'int');
+ }
+ }
+
+ test_executable_localVariables_inMethod() {
+ String code = r'''
+class C {
+ m() { // 1
+ int v;
+ f() {}
+ } // 2
+}
+''';
+ UnlinkedExecutable executable =
+ findExecutable('m', executables: serializeClassText(code).executables);
+ {
+ List<UnlinkedExecutable> functions = executable.localFunctions;
+ expect(functions, hasLength(1));
+ UnlinkedExecutable f = functions.singleWhere((v) => v.name == 'f');
+ _assertExecutableVisible(code, f, '{ // 1', '} // 2');
+ }
+ {
+ List<UnlinkedVariable> variables = executable.localVariables;
+ expect(variables, hasLength(1));
+ UnlinkedVariable v = variables.singleWhere((v) => v.name == 'v');
+ _assertVariableVisible(code, v, '{ // 1', '} // 2');
+ checkTypeRef(v.type, 'dart:core', 'dart:core', 'int');
+ }
+ }
+
+ test_executable_localVariables_inTopLevelFunction() {
+ String code = r'''
+f() { // 1
+ int v1 = 1;
+ { // 2
+ int v2 = 2;
+ } // 3
+ var v3 = 3;
+} // 4
+''';
+ UnlinkedExecutable executable = serializeExecutableText(code);
+ List<UnlinkedVariable> variables = executable.localVariables;
+ expect(variables, hasLength(3));
+ {
+ UnlinkedVariable v1 = variables.singleWhere((v) => v.name == 'v1');
+ _assertVariableVisible(code, v1, '{ // 1', '} // 4');
+ checkTypeRef(v1.type, 'dart:core', 'dart:core', 'int');
+ }
+ {
+ UnlinkedVariable v2 = variables.singleWhere((v) => v.name == 'v2');
+ _assertVariableVisible(code, v2, '{ // 2', '} // 3');
+ checkTypeRef(v2.type, 'dart:core', 'dart:core', 'int');
+ }
+ {
+ UnlinkedVariable v3 = variables.singleWhere((v) => v.name == 'v3');
+ _assertVariableVisible(code, v3, '{ // 1', '} // 4');
+ expect(v3.type, isNull);
+ }
+ }
+
+ test_executable_localVariables_inTopLevelGetter() {
+ String code = r'''
+get g { // 1
+ int v;
+ f() {}
+} // 2
+''';
+ UnlinkedExecutable executable = serializeExecutableText(code, 'g');
+ {
+ List<UnlinkedExecutable> functions = executable.localFunctions;
+ expect(functions, hasLength(1));
+ UnlinkedExecutable f = functions.singleWhere((v) => v.name == 'f');
+ _assertExecutableVisible(code, f, '{ // 1', '} // 2');
+ }
+ {
+ List<UnlinkedVariable> variables = executable.localVariables;
+ expect(variables, hasLength(1));
+ UnlinkedVariable v = variables.singleWhere((v) => v.name == 'v');
+ _assertVariableVisible(code, v, '{ // 1', '} // 2');
+ checkTypeRef(v.type, 'dart:core', 'dart:core', 'int');
+ }
+ }
+
test_executable_member_function() {
UnlinkedExecutable executable = findExecutable('f',
executables: serializeClassText('class C { f() {} }').executables);
expect(executable.kind, UnlinkedExecutableKind.functionOrMethod);
expect(executable.returnType, isNull);
expect(executable.isExternal, isFalse);
+ expect(executable.visibleOffset, 0);
+ expect(executable.visibleLength, 0);
}
test_executable_member_function_explicit_return() {
@@ -6094,6 +6280,15 @@ var v;''';
}
}
+ void _assertExecutableVisible(String code, UnlinkedExecutable f,
+ String visibleBegin, String visibleEnd) {
+ int expectedVisibleOffset = code.indexOf(visibleBegin);
+ int expectedVisibleLength =
+ code.indexOf(visibleEnd) - expectedVisibleOffset + 1;
+ expect(f.visibleOffset, expectedVisibleOffset);
+ expect(f.visibleLength, expectedVisibleLength);
+ }
+
void _assertUnlinkedConst(UnlinkedConst constExpr,
{bool isInvalid: false,
List<UnlinkedConstOperation> operators: const <UnlinkedConstOperation>[],
@@ -6113,6 +6308,15 @@ var v;''';
referenceValidators[i](constExpr.references[i]);
}
}
+
+ void _assertVariableVisible(
+ String code, UnlinkedVariable v, String visibleBegin, String visibleEnd) {
+ int expectedVisibleOffset = code.indexOf(visibleBegin);
+ int expectedVisibleLength =
+ code.indexOf(visibleEnd) - expectedVisibleOffset + 1;
+ expect(v.visibleOffset, expectedVisibleOffset);
+ expect(v.visibleLength, expectedVisibleLength);
+ }
}
/**
« no previous file with comments | « pkg/analyzer/lib/src/summary/summarize_elements.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698