blob: 810e4e71030ab3be7e566787d9b2ed2f10bc2f85 [file] [log] [blame]
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/dart/analysis/utilities.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/src/clients/angular_analyzer_plugin/angular_analyzer_plugin.dart';
import 'package:analyzer/src/test_utilities/find_node.dart';
import 'package:meta/meta.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../dart/resolution/context_collection_resolution.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(ResolveTemplateNodeTest);
});
}
@reflectiveTest
class ResolveTemplateNodeTest extends PubPackageResolutionTest {
test_asExpression() async {
await assertNoErrorsInCode(r'''
class MyComponent {}
''');
var source = findElement.unitElement.source;
var errorListener = RecordingErrorListener();
var template = _parseTemplate('var x = 0 as int;');
var node = template.findNode.variableDeclaration('x = ').initializer;
var overrideAsExpressionInvoked = false;
resolveTemplateNode(
componentClass: findElement.class_('MyComponent'),
templateSource: source,
localVariables: [],
node: node,
errorListener: errorListener,
errorReporter: ErrorReporter(errorListener, source),
overrideAsExpression: ({node, invokeSuper}) {
overrideAsExpressionInvoked = true;
expect(invokeSuper, isNotNull);
},
);
expect(overrideAsExpressionInvoked, isTrue);
}
test_references() async {
await assertNoErrorsInCode(r'''
class MyComponent {
void someContext() {
// ignore:unused_local_variable
var foo = 0;
}
void bar(int a) {}
}
''');
var source = findElement.unitElement.source;
var errorListener = RecordingErrorListener();
var template = _parseTemplate('var x = bar(foo);');
var node = template.findNode.variableDeclaration('x = ').initializer;
assertElementNull(template.findNode.simple('foo'));
assertElementNull(template.findNode.methodInvocation('bar'));
resolveTemplateNode(
componentClass: findElement.class_('MyComponent'),
templateSource: source,
localVariables: [
findElement.localVar('foo'),
],
node: node,
errorListener: errorListener,
errorReporter: ErrorReporter(errorListener, source),
);
assertElement(
template.findNode.simple('foo'),
findElement.localVar('foo'),
);
assertElement(
template.findNode.methodInvocation('bar'),
findElement.method('bar'),
);
}
_ParsedTemplate _parseTemplate(String templateCode) {
var templateUnit = parseString(
content: templateCode,
featureSet: result.unit.featureSet,
).unit;
return _ParsedTemplate(
content: templateCode,
unit: templateUnit,
findNode: FindNode(templateCode, templateUnit),
);
}
}
class _ParsedTemplate {
final String content;
final CompilationUnit unit;
final FindNode findNode;
_ParsedTemplate({
@required this.content,
@required this.unit,
@required this.findNode,
});
}