Build GenericFunctionTypeElementImpl in both ApiElementBuilder and LocalElementBuilder.

R=brianwilkerson@google.com
BUG=

Review-Url: https://codereview.chromium.org/2809423003 .
This commit is contained in:
Konstantin Shcheglov 2017-04-12 09:39:28 -07:00
parent d2a1bdff4a
commit 2143087734
2 changed files with 39 additions and 16 deletions

View file

@ -397,22 +397,6 @@ class ApiElementBuilder extends _BaseElementBuilder {
return null;
}
@override
Object visitGenericFunctionType(GenericFunctionType node) {
ElementHolder holder = new ElementHolder();
_visitChildren(holder, node);
GenericFunctionTypeElementImpl element =
new GenericFunctionTypeElementImpl.forOffset(node.beginToken.offset);
_setCodeRange(element, node);
element.parameters = holder.parameters;
element.typeParameters = holder.typeParameters;
FunctionType type = new FunctionTypeImpl(element);
element.type = type;
(node as GenericFunctionTypeImpl).type = type;
holder.validate();
return null;
}
@override
Object visitGenericTypeAlias(GenericTypeAlias node) {
ElementHolder holder = new ElementHolder();
@ -1480,6 +1464,22 @@ abstract class _BaseElementBuilder extends RecursiveAstVisitor<Object> {
return null;
}
@override
Object visitGenericFunctionType(GenericFunctionType node) {
ElementHolder holder = new ElementHolder();
_visitChildren(holder, node);
GenericFunctionTypeElementImpl element =
new GenericFunctionTypeElementImpl.forOffset(node.beginToken.offset);
_setCodeRange(element, node);
element.parameters = holder.parameters;
element.typeParameters = holder.typeParameters;
FunctionType type = new FunctionTypeImpl(element);
element.type = type;
(node as GenericFunctionTypeImpl).type = type;
holder.validate();
return null;
}
@override
Object visitSimpleFormalParameter(SimpleFormalParameter node) {
ParameterElementImpl parameter;

View file

@ -1114,6 +1114,19 @@ main() {
expect(variableElement.initializer, isNotNull);
}
void test_genericFunction_isExpression() {
buildElementsForText('main(p) { p is Function(int a, String); }');
var main = compilationUnit.declarations[0] as FunctionDeclaration;
var body = main.functionExpression.body as BlockFunctionBody;
var statement = body.block.statements[0] as ExpressionStatement;
var expression = statement.expression as IsExpression;
var typeNode = expression.type as GenericFunctionType;
var typeElement = typeNode.type.element as GenericFunctionTypeElementImpl;
expect(typeElement.parameters, hasLength(2));
expect(typeElement.parameters[0].name, 'a');
expect(typeElement.parameters[1].name, '');
}
void test_visitDefaultFormalParameter_local() {
CompilationUnit unit = parseCompilationUnit('''
main() {
@ -1221,6 +1234,16 @@ abstract class _ApiElementBuilderTestMixin {
*/
void checkMetadata(Element element);
void test_genericFunction_asTopLevelVariableType() {
buildElementsForText('int Function(int a, String) v;');
var v = compilationUnit.declarations[0] as TopLevelVariableDeclaration;
var typeNode = v.variables.type as GenericFunctionType;
var typeElement = typeNode.type.element as GenericFunctionTypeElementImpl;
expect(typeElement.parameters, hasLength(2));
expect(typeElement.parameters[0].name, 'a');
expect(typeElement.parameters[1].name, '');
}
void test_metadata_fieldDeclaration() {
List<FieldElement> fields =
buildElementsForText('class C { @a int x, y; }').types[0].fields;