blob: ae06f80fed8acb5ddd09519622b428b10861389d [file] [log] [blame]
// 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/analysis/session.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/utilities/extensions/file_system.dart';
import 'package:analyzer_utilities/testing/tree_string_sink.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../resolution/context_collection_resolution.dart';
import '../resolution/node_text_expectations.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(AnalysisSessionImplTest);
defineReflectiveTests(AnalysisSessionImpl_BlazeWorkspaceTest);
defineReflectiveTests(UpdateNodeTextExpectations);
});
}
@reflectiveTest
class AnalysisSessionImpl_BlazeWorkspaceTest
extends BlazeWorkspaceResolutionTest {
void test_getErrors_notFileOfUri() async {
var relPath = 'dart/my/lib/a.dart';
newFile('$workspaceRootPath/blaze-bin/$relPath', '');
var file = getFile('$workspaceRootPath/$relPath');
var session = contextFor(file).currentSession;
var result = await session.getErrors(file.path);
expect(result, isA<NotPathOfUriResult>());
}
void test_getErrors_valid() async {
var a = newFile('$workspaceRootPath/dart/my/lib/a.dart', 'var x = 0');
var session = contextFor(a).currentSession;
var result = await session.getErrorsValid(a);
expect(result.path, a.path);
expect(result.diagnostics, hasLength(1));
expect(result.uri.toString(), 'package:dart.my/a.dart');
}
void test_getParsedLibrary_notFileOfUri() {
var relPath = 'dart/my/lib/a.dart';
newFile('$workspaceRootPath/blaze-bin/$relPath', '');
var file = getFile('$workspaceRootPath/$relPath');
var session = contextFor(file).currentSession;
var result = session.getParsedLibrary(file.path);
expect(result, isA<NotPathOfUriResult>());
}
void test_getResolvedLibrary_notFileOfUri() async {
var relPath = 'dart/my/lib/a.dart';
newFile('$workspaceRootPath/blaze-bin/$relPath', '');
var file = getFile('$workspaceRootPath/$relPath');
var session = contextFor(file).currentSession;
var result = await session.getResolvedLibrary(file.path);
expect(result, isA<NotPathOfUriResult>());
}
void test_getResolvedUnit_notFileOfUri() async {
var relPath = 'dart/my/lib/a.dart';
newFile('$workspaceRootPath/blaze-bin/$relPath', '');
var file = getFile('$workspaceRootPath/$relPath');
var session = contextFor(file).currentSession;
var result = await session.getResolvedUnit(file.path);
expect(result, isA<NotPathOfUriResult>());
}
void test_getResolvedUnit_valid() async {
var file = newFile('$workspaceRootPath/dart/my/lib/a.dart', 'class A {}');
var session = contextFor(file).currentSession;
var result = await session.getResolvedUnit(file.path) as ResolvedUnitResult;
expect(result.path, file.path);
expect(result.diagnostics, isEmpty);
expect(result.uri.toString(), 'package:dart.my/a.dart');
}
void test_getUnitElement_invalidPath_notAbsolute() async {
var file = newFile('$workspaceRootPath/dart/my/lib/a.dart', 'class A {}');
var session = contextFor(file).currentSession;
var result = await session.getUnitElement('not_absolute.dart');
expect(result, isA<InvalidPathResult>());
}
void test_getUnitElement_notPathOfUri() async {
var relPath = 'dart/my/lib/a.dart';
newFile('$workspaceRootPath/blaze-bin/$relPath', '');
var file = getFile('$workspaceRootPath/$relPath');
var session = contextFor(file).currentSession;
var result = await session.getUnitElement(file.path);
expect(result, isA<NotPathOfUriResult>());
}
void test_getUnitElement_valid() async {
var file = newFile('$workspaceRootPath/dart/my/lib/a.dart', 'class A {}');
var session = contextFor(file).currentSession;
var result = await session.getUnitElementValid(file);
expect(result.path, file.path);
expect(result.fragment.classes, hasLength(1));
expect(result.uri.toString(), 'package:dart.my/a.dart');
}
}
@reflectiveTest
class AnalysisSessionImplTest extends PubPackageResolutionTest {
test_applyPendingFileChanges_getFile() async {
var a = newFile('$testPackageLibPath/a.dart', '');
var analysisContext = contextFor(a);
int lineCount_in_a() {
var result = analysisContext.currentSession.getFileValid(a);
return result.lineInfo.lineCount;
}
expect(lineCount_in_a(), 1);
newFile(a.path, '\n');
analysisContext.changeFile(a.path);
await analysisContext.applyPendingFileChanges();
// The file must be re-read after `applyPendingFileChanges()`.
expect(lineCount_in_a(), 2);
}
test_applyPendingFileChanges_getParsedLibrary() async {
var a = newFile('$testPackageLibPath/a.dart', '');
var analysisContext = contextFor(a);
int lineCount_in_a() {
var analysisSession = analysisContext.currentSession;
var result = analysisSession.getParsedLibraryValid(a);
return result.units.first.lineInfo.lineCount;
}
expect(lineCount_in_a(), 1);
newFile(a.path, '\n');
analysisContext.changeFile(a.path);
await analysisContext.applyPendingFileChanges();
// The file must be re-read after `applyPendingFileChanges()`.
expect(lineCount_in_a(), 2);
}
test_applyPendingFileChanges_getParsedUnit() async {
var a = newFile('$testPackageLibPath/a.dart', '');
var analysisContext = contextFor(a);
int lineCount_in_a() {
var result = analysisContext.currentSession.getParsedUnitValid(a);
return result.lineInfo.lineCount;
}
expect(lineCount_in_a(), 1);
newFile(a.path, '\n');
analysisContext.changeFile(a.path);
await analysisContext.applyPendingFileChanges();
// The file must be re-read after `applyPendingFileChanges()`.
expect(lineCount_in_a(), 2);
}
test_getErrors() async {
newFile(testFile.path, 'class C {');
var session = contextFor(testFile).currentSession;
var errorsResult = await session.getErrorsValid(testFile);
expect(errorsResult.session, session);
expect(errorsResult.path, testFile.path);
expect(errorsResult.diagnostics, isNotEmpty);
}
test_getErrors_inconsistent() async {
var test = newFile(testFile.path, '');
var session = contextFor(test).currentSession;
driverFor(test).changeFile(test.path);
expect(
() => session.getErrors(test.path),
throwsA(isA<InconsistentAnalysisException>()),
);
}
test_getErrors_invalidPath_notAbsolute() async {
var session = contextFor(testFile).currentSession;
var errorsResult = await session.getErrors('not_absolute.dart');
expect(errorsResult, isA<InvalidPathResult>());
}
test_getFile_inconsistent() async {
var test = newFile(testFile.path, '');
var session = contextFor(test).currentSession;
driverFor(test).changeFile(test.path);
expect(
() => session.getFile(test.path),
throwsA(isA<InconsistentAnalysisException>()),
);
}
test_getFile_invalidPath_notAbsolute() async {
var session = contextFor(testFile).currentSession;
var errorsResult = session.getFile('not_absolute.dart');
expect(errorsResult, isA<InvalidPathResult>());
}
test_getFile_library() async {
var content = 'class A {}';
var a = newFile('$testPackageLibPath/a.dart', content);
var session = contextFor(testFile).currentSession;
var file = session.getFileValid(a);
expect(file.path, a.path);
expect(file.uri.toString(), 'package:test/a.dart');
expect(file.content, content);
expect(file.isLibrary, isTrue);
expect(file.isPart, isFalse);
}
test_getFile_part() async {
var content = 'part of lib;';
var a = newFile('$testPackageLibPath/a.dart', content);
var session = contextFor(testFile).currentSession;
var file = session.getFileValid(a);
expect(file.path, a.path);
expect(file.uri.toString(), 'package:test/a.dart');
expect(file.content, content);
expect(file.isLibrary, isFalse);
expect(file.isPart, isTrue);
}
test_getLibraryByUri() async {
newFile(testFile.path, r'''
class A {}
class B {}
''');
var session = contextFor(testFile).currentSession;
var result = await session.getLibraryByUriValid('package:test/test.dart');
var library = result.element;
expect(library.getClass('A'), isNotNull);
expect(library.getClass('B'), isNotNull);
expect(library.getClass('C'), isNull);
}
test_getLibraryByUri_inconsistent() async {
var test = newFile(testFile.path, '');
var session = contextFor(test).currentSession;
driverFor(test).changeFile(test.path);
expect(
() => session.getLibraryByUriValid('package:test/test.dart'),
throwsA(isA<InconsistentAnalysisException>()),
);
}
test_getLibraryByUri_notLibrary_part() async {
newFile(testFile.path, r'''
part of 'a.dart';
''');
var session = contextFor(testFile).currentSession;
var result = await session.getLibraryByUri('package:test/test.dart');
expect(result, isA<NotLibraryButPartResult>());
}
test_getLibraryByUri_unresolvedUri() async {
var session = contextFor(testFile).currentSession;
var result = await session.getLibraryByUri('package:foo/foo.dart');
expect(result, isA<CannotResolveUriResult>());
}
test_getParsedLibrary() async {
var test = newFile('$testPackageLibPath/a.dart', r'''
class A {}
class B {}
''');
var session = contextFor(testFile).currentSession;
var parsedLibrary = session.getParsedLibraryValid(test);
expect(parsedLibrary.session, session);
expect(parsedLibrary.units, hasLength(1));
{
var parsedUnit = parsedLibrary.units[0];
expect(parsedUnit.session, session);
expect(parsedUnit.path, test.path);
expect(parsedUnit.uri, Uri.parse('package:test/a.dart'));
expect(parsedUnit.unit.declarations, hasLength(2));
}
}
test_getParsedLibrary_getElementDeclaration_class() async {
newFile(testFile.path, r'''
class A {}
class B {}
''');
var session = contextFor(testFile).currentSession;
var libraryResult = await session.getLibraryByUriValid(
'package:test/test.dart',
);
var parsedLibrary = session.getParsedLibraryValid(testFile);
var element = libraryResult.element.getClass('A')!;
var declaration =
parsedLibrary.getFragmentDeclaration(element.firstFragment)!;
var node = declaration.node as ClassDeclaration;
expect(node.name.lexeme, 'A');
expect(node.offset, 0);
expect(node.length, 10);
}
test_getParsedLibrary_getElementDeclaration_notThisLibrary() async {
newFile(testFile.path, '');
var session = contextFor(testFile).currentSession;
var resolvedUnit =
await session.getResolvedUnit(testFile.path) as ResolvedUnitResult;
var typeProvider = resolvedUnit.typeProvider;
var intClass = typeProvider.intType.element;
var parsedLibrary = session.getParsedLibraryValid(testFile);
expect(() {
parsedLibrary.getFragmentDeclaration(intClass.firstFragment);
}, throwsArgumentError);
}
test_getParsedLibrary_getElementDeclaration_synthetic() async {
newFile(testFile.path, r'''
int foo = 0;
''');
var session = contextFor(testFile).currentSession;
var parsedLibrary = session.getParsedLibraryValid(testFile);
var unitResult = await session.getUnitElementValid(testFile);
var fooElement = unitResult.fragment.topLevelVariables[0];
expect(fooElement.name, 'foo');
// We can get the variable element declaration.
var fooDeclaration = parsedLibrary.getFragmentDeclaration(fooElement)!;
var fooNode = fooDeclaration.node as VariableDeclaration;
expect(fooNode.name.lexeme, 'foo');
expect(fooNode.offset, 4);
expect(fooNode.length, 7);
// Synthetic elements don't have nodes.
expect(
parsedLibrary.getFragmentDeclaration(
fooElement.element.getter!.firstFragment,
),
isNull,
);
expect(
parsedLibrary.getFragmentDeclaration(
fooElement.element.setter!.firstFragment,
),
isNull,
);
}
test_getParsedLibrary_inconsistent() async {
var test = newFile(testFile.path, '');
var session = contextFor(test).currentSession;
driverFor(test).changeFile(test.path);
expect(
() => session.getParsedLibrary(test.path),
throwsA(isA<InconsistentAnalysisException>()),
);
}
test_getParsedLibrary_invalidPartUri() async {
newFile(testFile.path, r'''
part 'a.dart';
part ':[invalid uri].dart';
part 'c.dart';
''');
var session = contextFor(testFile).currentSession;
var parsedLibrary = session.getParsedLibraryValid(testFile);
expect(parsedLibrary.units, hasLength(1));
expect(
parsedLibrary.units[0].path,
convertPath('/home/test/lib/test.dart'),
);
}
test_getParsedLibrary_invalidPath_notAbsolute() async {
var session = contextFor(testFile).currentSession;
var result = session.getParsedLibrary('not_absolute.dart');
expect(result, isA<InvalidPathResult>());
}
test_getParsedLibrary_notLibrary() async {
var test = newFile(testFile.path, 'part of "a.dart";');
var session = contextFor(testFile).currentSession;
expect(session.getParsedLibrary(test.path), isA<NotLibraryButPartResult>());
}
test_getParsedLibrary_parts() async {
var aContent = r'''
part 'b.dart';
part 'c.dart';
class A {}
''';
var bContent = r'''
part of 'a.dart';
class B1 {}
class B2 {}
''';
var cContent = r'''
part of 'a.dart';
class C1 {}
class C2 {}
class C3 {}
''';
var a = newFile('$testPackageLibPath/a.dart', aContent);
var b = newFile('$testPackageLibPath/b.dart', bContent);
var c = newFile('$testPackageLibPath/c.dart', cContent);
var session = contextFor(testFile).currentSession;
var parsedLibrary = session.getParsedLibraryValid(a);
expect(parsedLibrary.units, hasLength(3));
{
var aUnit = parsedLibrary.units[0];
expect(aUnit.path, a.path);
expect(aUnit.uri, Uri.parse('package:test/a.dart'));
expect(aUnit.unit.declarations, hasLength(1));
}
{
var bUnit = parsedLibrary.units[1];
expect(bUnit.path, b.path);
expect(bUnit.uri, Uri.parse('package:test/b.dart'));
expect(bUnit.unit.declarations, hasLength(2));
}
{
var cUnit = parsedLibrary.units[2];
expect(cUnit.path, c.path);
expect(cUnit.uri, Uri.parse('package:test/c.dart'));
expect(cUnit.unit.declarations, hasLength(3));
}
}
test_getParsedLibraryByElement() async {
var test = newFile(testFile.path, '');
var session = contextFor(testFile).currentSession;
var libraryResult = await session.getLibraryByUriValid(
'package:test/test.dart',
);
var element = libraryResult.element;
var parsedLibrary = session.getParsedLibraryByElementValid(element);
expect(parsedLibrary.session, session);
expect(parsedLibrary.units, hasLength(1));
{
var unit = parsedLibrary.units[0];
expect(unit.path, test.path);
expect(unit.uri, Uri.parse('package:test/test.dart'));
expect(unit.unit, isNotNull);
}
}
test_getParsedLibraryByElement_differentSession() async {
newFile(testFile.path, '');
var session = contextFor(testFile).currentSession;
var libraryResult = await session.getLibraryByUriValid(
'package:test/test.dart',
);
var element = libraryResult.element;
var aaaFile = getFile('$workspaceRootPath/aaa/lib/a.dart');
var aaaSession = contextFor(aaaFile).currentSession;
var result = aaaSession.getParsedLibraryByElement(element);
expect(result, isA<NotElementOfThisSessionResult>());
}
test_getParsedUnit() async {
newFile(testFile.path, r'''
class A {}
class B {}
''');
var session = contextFor(testFile).currentSession;
var unitResult = session.getParsedUnitValid(testFile);
expect(unitResult.session, session);
expect(unitResult.path, testFile.path);
expect(unitResult.uri, Uri.parse('package:test/test.dart'));
expect(unitResult.unit.declarations, hasLength(2));
}
test_getParsedUnit_inconsistent() async {
var test = newFile(testFile.path, '');
var session = contextFor(test).currentSession;
driverFor(test).changeFile(test.path);
expect(
() => session.getParsedUnit(test.path),
throwsA(isA<InconsistentAnalysisException>()),
);
}
test_getParsedUnit_invalidPath_notAbsolute() async {
var session = contextFor(testFile).currentSession;
var result = session.getParsedUnit('not_absolute.dart');
expect(result, isA<InvalidPathResult>());
}
test_getResolvedLibrary() async {
var aContent = r'''
part 'b.dart';
class A /*a*/ {}
''';
var a = newFile('$testPackageLibPath/a.dart', aContent);
var bContent = r'''
part of 'a.dart';
class B /*b*/ {}
class B2 extends X {}
''';
var b = newFile('$testPackageLibPath/b.dart', bContent);
var session = contextFor(testFile).currentSession;
var resolvedLibrary = await session.getResolvedLibraryValid(a);
expect(resolvedLibrary.session, session);
var typeProvider = resolvedLibrary.typeProvider;
expect(typeProvider.intType.element.name, 'int');
var libraryElement = resolvedLibrary.element;
var aClass = libraryElement.getClass('A')!;
var bClass = libraryElement.getClass('B')!;
var aUnitResult = resolvedLibrary.units[0];
expect(aUnitResult.path, a.path);
expect(aUnitResult.uri, Uri.parse('package:test/a.dart'));
expect(aUnitResult.content, aContent);
expect(aUnitResult.unit, isNotNull);
expect(aUnitResult.unit.directives, hasLength(1));
expect(aUnitResult.unit.declarations, hasLength(1));
expect(aUnitResult.diagnostics, isEmpty);
var bUnitResult = resolvedLibrary.units[1];
expect(bUnitResult.path, b.path);
expect(bUnitResult.uri, Uri.parse('package:test/b.dart'));
expect(bUnitResult.content, bContent);
expect(bUnitResult.unit, isNotNull);
expect(bUnitResult.unit.directives, hasLength(1));
expect(bUnitResult.unit.declarations, hasLength(2));
expect(bUnitResult.diagnostics, isNotEmpty);
var aDeclaration =
resolvedLibrary.getFragmentDeclaration(aClass.firstFragment)!;
var aNode = aDeclaration.node as ClassDeclaration;
expect(aNode.name.lexeme, 'A');
expect(aNode.offset, 16);
expect(aNode.length, 16);
expect(aNode.declaredFragment!.name, 'A');
var bDeclaration =
resolvedLibrary.getFragmentDeclaration(bClass.firstFragment)!;
var bNode = bDeclaration.node as ClassDeclaration;
expect(bNode.name.lexeme, 'B');
expect(bNode.offset, 19);
expect(bNode.length, 16);
expect(bNode.declaredFragment!.name, 'B');
}
test_getResolvedLibrary_getElementDeclaration_notThisLibrary() async {
newFile(testFile.path, '');
var session = contextFor(testFile).currentSession;
var resolvedLibrary = await session.getResolvedLibraryValid(testFile);
expect(() {
var intClass = resolvedLibrary.typeProvider.intType.element;
resolvedLibrary.getFragmentDeclaration(intClass.firstFragment);
}, throwsArgumentError);
}
test_getResolvedLibrary_getElementDeclaration_synthetic() async {
newFile(testFile.path, r'''
int foo = 0;
''');
var session = contextFor(testFile).currentSession;
var resolvedLibrary = await session.getResolvedLibraryValid(testFile);
var unitElement = resolvedLibrary.element.firstFragment;
var fooElement = unitElement.topLevelVariables[0];
expect(fooElement.name, 'foo');
// We can get the variable element declaration.
var fooDeclaration = resolvedLibrary.getFragmentDeclaration(fooElement)!;
var fooNode = fooDeclaration.node as VariableDeclaration;
expect(fooNode.name.lexeme, 'foo');
expect(fooNode.offset, 4);
expect(fooNode.length, 7);
expect(fooNode.declaredFragment!.name, 'foo');
// Synthetic elements don't have nodes.
expect(
resolvedLibrary.getFragmentDeclaration(
fooElement.element.getter!.firstFragment,
),
isNull,
);
expect(
resolvedLibrary.getFragmentDeclaration(
fooElement.element.setter!.firstFragment,
),
isNull,
);
}
test_getResolvedLibrary_inconsistent() async {
var test = newFile(testFile.path, '');
var session = contextFor(test).currentSession;
driverFor(test).changeFile(test.path);
expect(
() => session.getResolvedLibrary(test.path),
throwsA(isA<InconsistentAnalysisException>()),
);
}
test_getResolvedLibrary_invalidPartUri() async {
newFile(testFile.path, r'''
part 'a.dart';
part ':[invalid uri].dart';
part 'c.dart';
''');
var session = contextFor(testFile).currentSession;
var resolvedLibrary = await session.getResolvedLibraryValid(testFile);
expect(resolvedLibrary.units, hasLength(1));
expect(
resolvedLibrary.units[0].path,
convertPath('/home/test/lib/test.dart'),
);
}
test_getResolvedLibrary_invalidPath_notAbsolute() async {
var session = contextFor(testFile).currentSession;
var result = await session.getResolvedLibrary('not_absolute.dart');
expect(result, isA<InvalidPathResult>());
}
test_getResolvedLibrary_notLibrary_part() async {
var test = newFile(testFile.path, 'part of "a.dart";');
var session = contextFor(testFile).currentSession;
var result = await session.getResolvedLibrary(test.path);
expect(result, isA<NotLibraryButPartResult>());
}
test_getResolvedLibraryByElement() async {
var test = newFile(testFile.path, '');
var session = contextFor(testFile).currentSession;
var libraryResult = await session.getLibraryByUriValid(
'package:test/test.dart',
);
var element = libraryResult.element;
var result = await session.getResolvedLibraryByElementValid(element);
expect(result.session, session);
expect(result.units, hasLength(1));
expect(result.units[0].path, test.path);
expect(result.units[0].uri, Uri.parse('package:test/test.dart'));
expect(result.units[0].unit.declaredFragment, isNotNull);
}
test_getResolvedLibraryByElement_differentSession() async {
newFile(testFile.path, '');
var session = contextFor(testFile).currentSession;
var libraryResult = await session.getLibraryByUriValid(
'package:test/test.dart',
);
var element = libraryResult.element;
var aaaFile = getFile('$workspaceRootPath/aaa/lib/a.dart');
var aaaSession = contextFor(aaaFile).currentSession;
var result = await aaaSession.getResolvedLibraryByElement(element);
expect(result, isA<NotElementOfThisSessionResult>());
}
test_getResolvedLibraryContaining_library() async {
var a = newFile('$testPackageLibPath/a.dart', '');
var currentSession = contextFor(a).currentSession;
var filePath = a.toUri().toFilePath();
var result = await currentSession.getResolvedLibraryContaining(filePath);
var units = (result as ResolvedLibraryResult).units;
var paths = units.map((unit) => unit.path);
expect(paths, unorderedEquals([a.path]));
}
test_getResolvedLibraryContaining_part() async {
var lib = newFile('$testPackageLibPath/lib.dart', r'''
part 'part.dart';
''');
var part = newFile('$testPackageLibPath/part.dart', r'''
part of 'lib.dart';
''');
var currentSession = contextFor(part).currentSession;
var filePath = part.toUri().toFilePath();
var result = await currentSession.getResolvedLibraryContaining(filePath);
var units = (result as ResolvedLibraryResult).units;
var paths = units.map((unit) => unit.path);
expect(paths, unorderedEquals([lib.path, part.path]));
}
test_getResolvedLibraryContaining_part_part() async {
var lib = newFile('$testPackageLibPath/lib.dart', r'''
part 'part.dart';
''');
var part = newFile('$testPackageLibPath/part.dart', r'''
part of 'lib.dart';
part 'part_part.dart';
''');
var partPart = newFile('$testPackageLibPath/part_part.dart', r'''
part of 'part.dart';
''');
var currentSession = contextFor(partPart).currentSession;
var filePath = partPart.toUri().toFilePath();
var result = await currentSession.getResolvedLibraryContaining(filePath);
var units = (result as ResolvedLibraryResult).units;
var paths = units.map((unit) => unit.path);
expect(paths, unorderedEquals([lib.path, part.path, partPart.path]));
}
test_getResolvedUnit() async {
var test = newFile(testFile.path, r'''
class A {}
class B {}
''');
var session = contextFor(testFile).currentSession;
var unitResult =
await session.getResolvedUnit(test.path) as ResolvedUnitResult;
expect(unitResult.session, session);
expect(unitResult.path, test.path);
expect(unitResult.uri, Uri.parse('package:test/test.dart'));
expect(unitResult.unit.declarations, hasLength(2));
expect(unitResult.typeProvider, isNotNull);
expect(unitResult.libraryElement, isNotNull);
}
test_getResolvedUnit_inconsistent() async {
var test = newFile(testFile.path, '');
var session = contextFor(test).currentSession;
driverFor(test).changeFile(test.path);
expect(
() => session.getResolvedUnit(test.path),
throwsA(isA<InconsistentAnalysisException>()),
);
}
test_getUnitElement_inconsistent() async {
var test = newFile(testFile.path, '');
var session = contextFor(test).currentSession;
driverFor(test).changeFile(test.path);
expect(
() => session.getUnitElement(test.path),
throwsA(isA<InconsistentAnalysisException>()),
);
}
test_getUnitElement_libraryUnit() async {
newFile(testFile.path, r'''
class A {}
class B {}
''');
await _assertFileUnitElementResultText(testFile, r'''
unitElementResult
path: /home/test/lib/test.dart
uri: package:test/test.dart
element
library: root::package:test/test.dart
classes: A, B
''');
}
test_getUnitElement_partOfUriKnown_inLibrary() async {
var a = newFile('$testPackageLibPath/a.dart', r'''
part of 'test.dart';
class A {}
class B {}
''');
newFile(testFile.path, r'''
part 'a.dart';
''');
await _assertFileUnitElementResultText(a, r'''
unitElementResult
path: /home/test/lib/a.dart
uri: package:test/a.dart
element
library: root::package:test/test.dart
classes: A, B
''');
}
test_getUnitElement_partOfUriKnown_notInLibrary() async {
var a = newFile('$testPackageLibPath/a.dart', r'''
part of 'test.dart';
class A {}
class B {}
''');
await _assertFileUnitElementResultText(a, r'''
unitElementResult
path: /home/test/lib/a.dart
uri: package:test/a.dart
element
library: root::package:test/a.dart
classes: A, B
''');
}
test_getUnitElement_partOfUriName_inLibrary() async {
var a = newFile('$testPackageLibPath/a.dart', r'''
part of my_lib;
class A {}
class B {}
''');
newFile(testFile.path, r'''
library my_lib;
part 'a.dart';
''');
await _assertFileUnitElementResultText(a, r'''
unitElementResult
path: /home/test/lib/a.dart
uri: package:test/a.dart
element
library: root::package:test/test.dart
classes: A, B
''');
}
test_getUnitElement_partOfUriName_notInLibrary() async {
var a = newFile('$testPackageLibPath/a.dart', r'''
part of my_lib;
class A {}
class B {}
''');
await _assertFileUnitElementResultText(a, r'''
unitElementResult
path: /home/test/lib/a.dart
uri: package:test/a.dart
element
library: root::package:test/a.dart
classes: A, B
''');
}
test_getUnitElement_partOfUriUnknown() async {
var a = newFile('$testPackageLibPath/a.dart', r'''
part of 'foo:bar';
class A {}
class B {}
''');
await _assertFileUnitElementResultText(a, r'''
unitElementResult
path: /home/test/lib/a.dart
uri: package:test/a.dart
element
library: root::package:test/a.dart
classes: A, B
''');
}
test_resourceProvider() async {
var session = contextFor(testFile).currentSession;
expect(session.resourceProvider, resourceProvider);
}
Future<void> _assertFileUnitElementResultText(
File file,
String expected,
) async {
var session = contextFor(file).currentSession;
var unitResult = await session.getUnitElementValid(file);
_assertUnitElementResultText(unitResult, expected);
}
void _assertUnitElementResultText(UnitElementResult result, String expected) {
var actual = _getElementUnitResultText(result);
if (actual != expected) {
print('-------- Actual --------');
print('$actual------------------------');
NodeTextExpectationsCollector.add(actual);
}
expect(actual, expected);
}
String _getElementUnitResultText(UnitElementResult result) {
var buffer = StringBuffer();
var sink = TreeStringSink(sink: buffer, indent: '');
sink.writelnWithIndent('unitElementResult');
sink.withIndent(() {
// We could print it, but currently it is always the current.
expect(result.session, contextFor(testFile).currentSession);
var file = result.file;
sink.writelnWithIndent('path: ${file.posixPath}');
sink.writelnWithIndent('uri: ${result.uri}');
sink.writelnWithIndent('element');
sink.withIndent(() {
var element = result.fragment as LibraryFragmentImpl;
var library =
(element as LibraryFragment).element as LibraryElementImpl;
sink.writelnWithIndent('library: ${library.reference}');
var classListStr = element.classes.map((e) => e.name).join(', ');
sink.writelnWithIndent('classes: $classListStr');
});
});
return buffer.toString();
}
}
extension on AnalysisSession {
Future<ErrorsResult> getErrorsValid(File file) async {
return await getErrors(file.path) as ErrorsResult;
}
FileResult getFileValid(File file) {
return getFile(file.path) as FileResult;
}
Future<LibraryElementResult> getLibraryByUriValid(String uriStr) async {
return await getLibraryByUri(uriStr) as LibraryElementResult;
}
ParsedLibraryResult getParsedLibraryByElementValid(LibraryElement element) {
return getParsedLibraryByElement(element) as ParsedLibraryResult;
}
ParsedLibraryResult getParsedLibraryValid(File file) {
return getParsedLibrary(file.path) as ParsedLibraryResult;
}
ParsedUnitResult getParsedUnitValid(File file) {
return getParsedUnit(file.path) as ParsedUnitResult;
}
Future<ResolvedLibraryResult> getResolvedLibraryByElementValid(
LibraryElement element,
) async {
return await getResolvedLibraryByElement(element) as ResolvedLibraryResult;
}
Future<ResolvedLibraryResult> getResolvedLibraryValid(File file) async {
return await getResolvedLibrary(file.path) as ResolvedLibraryResult;
}
Future<UnitElementResult> getUnitElementValid(File file) async {
return await getUnitElement(file.path) as UnitElementResult;
}
}