5d6dc673dc
This allows us to traverse the children without needing to create lists. It also allows us to iterate over lists of nodes more efficiently. Tested against the script that computes fixes for 10,000 diagnostics, I'm seeing the following result. Before this CL the average time was 10692.4 ms. After this CL the average time was 1900.0 ms. That's just over an 82% improvement. Change-Id: Ideff745288c8990e9948b22c5204d176af3cac6e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/426904 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
128 lines
3.7 KiB
Dart
128 lines
3.7 KiB
Dart
// Copyright (c) 2017, 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/results.dart';
|
|
import 'package:analyzer/dart/ast/ast.dart';
|
|
import 'package:analyzer/dart/element/element.dart';
|
|
import 'package:analyzer/src/dart/ast/element_locator.dart';
|
|
import 'package:analyzer/src/error/codes.dart';
|
|
import 'package:analyzer/src/test_utilities/find_element2.dart';
|
|
import 'package:analyzer/src/test_utilities/find_node.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
import 'abstract_context.dart';
|
|
|
|
class AbstractSingleUnitTest extends AbstractContextTest {
|
|
bool verifyNoTestUnitErrors = true;
|
|
|
|
late ResolvedUnitResult result;
|
|
late String testCode;
|
|
late String testFile;
|
|
late CompilationUnit testUnit;
|
|
late FindNode findNode;
|
|
late FindElement2 findElement2;
|
|
|
|
void addTestSource(String code) {
|
|
testCode = code;
|
|
addSource(testFile, code);
|
|
}
|
|
|
|
int findEnd(String search) {
|
|
return findOffset(search) + search.length;
|
|
}
|
|
|
|
/// Returns the [SimpleIdentifier] at the given search pattern.
|
|
SimpleIdentifier findIdentifier(String search) {
|
|
return findNodeAtString(search, (node) => node is SimpleIdentifier)
|
|
as SimpleIdentifier;
|
|
}
|
|
|
|
AstNode? findNodeAtOffset(
|
|
int offset, [
|
|
bool Function(AstNode)? predicate,
|
|
]) {
|
|
var node = testUnit.nodeCovering(offset: offset);
|
|
if (node != null && predicate != null) {
|
|
node = node.thisOrAncestorMatching(predicate);
|
|
}
|
|
return node;
|
|
}
|
|
|
|
AstNode? findNodeAtString(
|
|
String search, [
|
|
bool Function(AstNode)? predicate,
|
|
]) {
|
|
var offset = findOffset(search);
|
|
return findNodeAtOffset(offset, predicate);
|
|
}
|
|
|
|
Element? findNodeElementAtString(
|
|
String search, [
|
|
bool Function(AstNode)? predicate,
|
|
]) {
|
|
var node = findNodeAtString(search, predicate);
|
|
if (node == null) {
|
|
return null;
|
|
}
|
|
return ElementLocator.locate2(node);
|
|
}
|
|
|
|
int findOffset(String search) {
|
|
var offset = testCode.indexOf(search);
|
|
expect(offset, isNonNegative, reason: "Not found '$search' in\n$testCode");
|
|
return offset;
|
|
}
|
|
|
|
int getLeadingIdentifierLength(String search) {
|
|
var length = 0;
|
|
while (length < search.length) {
|
|
var c = search.codeUnitAt(length);
|
|
if (c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0)) {
|
|
length++;
|
|
continue;
|
|
}
|
|
if (c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0)) {
|
|
length++;
|
|
continue;
|
|
}
|
|
if (c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0)) {
|
|
length++;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
return length;
|
|
}
|
|
|
|
Future<void> resolveTestCode(String code) async {
|
|
addTestSource(code);
|
|
await resolveTestFile();
|
|
}
|
|
|
|
Future<void> resolveTestFile() async {
|
|
result = await resolveFile(testFile);
|
|
testCode = result.content;
|
|
testUnit = result.unit;
|
|
if (verifyNoTestUnitErrors) {
|
|
expect(result.errors.where((error) {
|
|
return error.errorCode != WarningCode.DEAD_CODE &&
|
|
error.errorCode != WarningCode.UNUSED_CATCH_CLAUSE &&
|
|
error.errorCode != WarningCode.UNUSED_CATCH_STACK &&
|
|
error.errorCode != WarningCode.UNUSED_ELEMENT &&
|
|
error.errorCode != WarningCode.UNUSED_FIELD &&
|
|
error.errorCode != WarningCode.UNUSED_IMPORT &&
|
|
error.errorCode != WarningCode.UNUSED_LOCAL_VARIABLE;
|
|
}), isEmpty);
|
|
}
|
|
findNode = FindNode(testCode, testUnit);
|
|
findElement2 = FindElement2(testUnit);
|
|
}
|
|
|
|
@override
|
|
void setUp() {
|
|
super.setUp();
|
|
testFile = convertPath('$testPackageRootPath/test.dart');
|
|
}
|
|
}
|