Index: pkg/analyzer/test/dart/element/builder_test.dart |
diff --git a/pkg/analyzer/test/dart/element/builder_test.dart b/pkg/analyzer/test/dart/element/builder_test.dart |
index 224b192d1efd379b0d042b7b7b7638e7cb75d489..7623aa0626f801255b43cd86c93219426d856eb9 100644 |
--- a/pkg/analyzer/test/dart/element/builder_test.dart |
+++ b/pkg/analyzer/test/dart/element/builder_test.dart |
@@ -27,6 +27,7 @@ main() { |
defineReflectiveSuite(() { |
defineReflectiveTests(ApiElementBuilderTest); |
defineReflectiveTests(ElementBuilderTest); |
+ defineReflectiveTests(LocalElementBuilderTest); |
}); |
} |
@@ -186,63 +187,6 @@ class C { |
compilationUnitElement = new CompilationUnitElementImpl('test.dart'); |
} |
- void test_visitDefaultFormalParameter_noType() { |
- // p = 0 |
- String parameterName = 'p'; |
- DefaultFormalParameter formalParameter = |
- AstFactory.positionalFormalParameter( |
- AstFactory.simpleFormalParameter3(parameterName), |
- AstFactory.integer(0)); |
- formalParameter.beginToken.offset = 50; |
- formalParameter.endToken.offset = 80; |
- |
- ElementHolder holder = buildElementsForAst(formalParameter); |
- List<ParameterElement> parameters = holder.parameters; |
- expect(parameters, hasLength(1)); |
- ParameterElement parameter = parameters[0]; |
- assertHasCodeRange(parameter, 50, 31); |
- expect(parameter.hasImplicitType, isTrue); |
- expect(parameter.initializer, isNotNull); |
- expect(parameter.initializer.type, isNotNull); |
- expect(parameter.initializer.hasImplicitReturnType, isTrue); |
- expect(parameter.isConst, isFalse); |
- expect(parameter.isDeprecated, isFalse); |
- expect(parameter.isFinal, isFalse); |
- expect(parameter.isInitializingFormal, isFalse); |
- expect(parameter.isOverride, isFalse); |
- expect(parameter.isPrivate, isFalse); |
- expect(parameter.isPublic, isTrue); |
- expect(parameter.isSynthetic, isFalse); |
- expect(parameter.name, parameterName); |
- } |
- |
- void test_visitDefaultFormalParameter_type() { |
- // E p = 0 |
- String parameterName = 'p'; |
- DefaultFormalParameter formalParameter = AstFactory.namedFormalParameter( |
- AstFactory.simpleFormalParameter4( |
- AstFactory.typeName4('E'), parameterName), |
- AstFactory.integer(0)); |
- |
- ElementHolder holder = buildElementsForAst(formalParameter); |
- List<ParameterElement> parameters = holder.parameters; |
- expect(parameters, hasLength(1)); |
- ParameterElement parameter = parameters[0]; |
- expect(parameter.hasImplicitType, isFalse); |
- expect(parameter.initializer, isNotNull); |
- expect(parameter.initializer.type, isNotNull); |
- expect(parameter.initializer.hasImplicitReturnType, isTrue); |
- expect(parameter.isConst, isFalse); |
- expect(parameter.isDeprecated, isFalse); |
- expect(parameter.isFinal, isFalse); |
- expect(parameter.isInitializingFormal, isFalse); |
- expect(parameter.isOverride, isFalse); |
- expect(parameter.isPrivate, isFalse); |
- expect(parameter.isPublic, isTrue); |
- expect(parameter.isSynthetic, isFalse); |
- expect(parameter.name, parameterName); |
- } |
- |
void test_metadata_localVariableDeclaration() { |
List<LocalVariableElement> localVariables = |
buildElementsForText('f() { @a int x, y; }') |
@@ -357,6 +301,63 @@ class C { |
expect(variable.name, 'i'); |
} |
+ void test_visitDefaultFormalParameter_noType() { |
+ // p = 0 |
+ String parameterName = 'p'; |
+ DefaultFormalParameter formalParameter = |
+ AstFactory.positionalFormalParameter( |
+ AstFactory.simpleFormalParameter3(parameterName), |
+ AstFactory.integer(0)); |
+ formalParameter.beginToken.offset = 50; |
+ formalParameter.endToken.offset = 80; |
+ |
+ ElementHolder holder = buildElementsForAst(formalParameter); |
+ List<ParameterElement> parameters = holder.parameters; |
+ expect(parameters, hasLength(1)); |
+ ParameterElement parameter = parameters[0]; |
+ assertHasCodeRange(parameter, 50, 31); |
+ expect(parameter.hasImplicitType, isTrue); |
+ expect(parameter.initializer, isNotNull); |
+ expect(parameter.initializer.type, isNotNull); |
+ expect(parameter.initializer.hasImplicitReturnType, isTrue); |
+ expect(parameter.isConst, isFalse); |
+ expect(parameter.isDeprecated, isFalse); |
+ expect(parameter.isFinal, isFalse); |
+ expect(parameter.isInitializingFormal, isFalse); |
+ expect(parameter.isOverride, isFalse); |
+ expect(parameter.isPrivate, isFalse); |
+ expect(parameter.isPublic, isTrue); |
+ expect(parameter.isSynthetic, isFalse); |
+ expect(parameter.name, parameterName); |
+ } |
+ |
+ void test_visitDefaultFormalParameter_type() { |
+ // E p = 0 |
+ String parameterName = 'p'; |
+ DefaultFormalParameter formalParameter = AstFactory.namedFormalParameter( |
+ AstFactory.simpleFormalParameter4( |
+ AstFactory.typeName4('E'), parameterName), |
+ AstFactory.integer(0)); |
+ |
+ ElementHolder holder = buildElementsForAst(formalParameter); |
+ List<ParameterElement> parameters = holder.parameters; |
+ expect(parameters, hasLength(1)); |
+ ParameterElement parameter = parameters[0]; |
+ expect(parameter.hasImplicitType, isFalse); |
+ expect(parameter.initializer, isNotNull); |
+ expect(parameter.initializer.type, isNotNull); |
+ expect(parameter.initializer.hasImplicitReturnType, isTrue); |
+ expect(parameter.isConst, isFalse); |
+ expect(parameter.isDeprecated, isFalse); |
+ expect(parameter.isFinal, isFalse); |
+ expect(parameter.isInitializingFormal, isFalse); |
+ expect(parameter.isOverride, isFalse); |
+ expect(parameter.isPrivate, isFalse); |
+ expect(parameter.isPublic, isTrue); |
+ expect(parameter.isSynthetic, isFalse); |
+ expect(parameter.name, parameterName); |
+ } |
+ |
void test_visitFunctionExpression() { |
ElementHolder holder = new ElementHolder(); |
ElementBuilder builder = _makeBuilder(holder); |
@@ -879,6 +880,109 @@ class C { |
} |
} |
+@reflectiveTest |
+class LocalElementBuilderTest extends _BaseTest { |
+ @override |
+ AstVisitor createElementBuilder(ElementHolder holder) { |
+ return new LocalElementBuilder(holder, compilationUnitElement); |
+ } |
+ |
+ void test_buildLocalElements() { |
+ CompilationUnit unit = ParserTestCase.parseCompilationUnit(r''' |
+main() { |
+ int v1; |
+ f1() { |
+ int v2; |
+ f2() { |
+ int v3; |
+ } |
+ } |
+} |
+'''); |
+ var mainAst = unit.declarations.single as FunctionDeclaration; |
+ // Build API elements. |
+ FunctionElementImpl main; |
+ { |
+ ElementHolder holder = new ElementHolder(); |
+ unit.accept(new ApiElementBuilder(holder, compilationUnitElement)); |
+ main = holder.functions.single as FunctionElementImpl; |
+ } |
+ expect(main.localVariables, isEmpty); |
+ expect(main.functions, isEmpty); |
+ // Build local elements in body. |
+ ElementHolder holder = new ElementHolder(); |
+ FunctionBody mainBody = mainAst.functionExpression.body; |
+ mainBody.accept(new LocalElementBuilder(holder, compilationUnitElement)); |
+ main.functions = holder.functions; |
+ main.localVariables = holder.localVariables; |
+ expect(main.localVariables.map((v) => v.name), ['v1']); |
+ expect(main.functions, hasLength(1)); |
+ { |
+ FunctionElement f1 = main.functions[0]; |
+ expect(f1.name, 'f1'); |
+ expect(f1.localVariables.map((v) => v.name), ['v2']); |
+ expect(f1.functions, hasLength(1)); |
+ { |
+ FunctionElement f2 = f1.functions[0]; |
+ expect(f2.name, 'f2'); |
+ expect(f2.localVariables.map((v) => v.name), ['v3']); |
+ expect(f2.functions, isEmpty); |
+ } |
+ } |
+ } |
+ |
+ void test_buildParameterInitializer() { |
+ CompilationUnit unit = ParserTestCase.parseCompilationUnit('f({p: 42}) {}'); |
+ var function = unit.declarations.single as FunctionDeclaration; |
+ var parameter = function.functionExpression.parameters.parameters.single |
+ as DefaultFormalParameter; |
+ // Build API elements. |
+ { |
+ ElementHolder holder = new ElementHolder(); |
+ unit.accept(new ApiElementBuilder(holder, compilationUnitElement)); |
+ } |
+ // Validate the parameter element. |
+ var parameterElement = parameter.element as ParameterElementImpl; |
+ expect(parameterElement, isNotNull); |
+ expect(parameterElement.initializer, isNull); |
+ // Build the initializer element. |
+ new LocalElementBuilder(new ElementHolder(), compilationUnitElement) |
+ .buildParameterInitializer(parameterElement, parameter.defaultValue); |
+ expect(parameterElement.initializer, isNotNull); |
+ } |
+ |
+ void test_buildVariableInitializer() { |
+ CompilationUnit unit = ParserTestCase.parseCompilationUnit('var V = 42;'); |
+ TopLevelVariableDeclaration topLevelDecl = |
+ unit.declarations[0] as TopLevelVariableDeclaration; |
+ VariableDeclaration variable = topLevelDecl.variables.variables.single; |
+ // Build the variable element. |
+ { |
+ ElementHolder holder = new ElementHolder(); |
+ unit.accept(new ApiElementBuilder(holder, compilationUnitElement)); |
+ } |
+ // Validate the variable element. |
+ var variableElement = variable.element as VariableElementImpl; |
+ expect(variableElement, isNotNull); |
+ expect(variableElement.initializer, isNull); |
+ // Build the initializer element. |
+ new LocalElementBuilder(new ElementHolder(), compilationUnitElement) |
+ .buildVariableInitializer(variableElement, variable.initializer); |
+ expect(variableElement.initializer, isNotNull); |
+ } |
+ |
+ void test_visitVariableDeclaration_local() { |
+ var holder = buildElementsForText('class C { m() { T v = null; } }'); |
+ List<LocalVariableElement> variableElements = holder.localVariables; |
+ expect(variableElements, hasLength(1)); |
+ LocalVariableElement variableElement = variableElements[0]; |
+ expect(variableElement.hasImplicitType, isFalse); |
+ expect(variableElement.name, 'v'); |
+ expect(variableElement.initializer, isNotNull); |
+ _assertVisibleRange(variableElement, 14, 29); |
+ } |
+} |
+ |
/** |
* Mixin with test methods for testing element building in [ApiElementBuilder]. |
* It is used to test the [ApiElementBuilder] itself, and its usage by |