Fix regression for import suggestions

Imports weren't being suggested for implicit source files,
for example files from other analysis roots.

BUG=
R=brianwilkerson@google.com, scheglov@google.com

Review URL: https://codereview.chromium.org/1759333002 .
This commit is contained in:
Brian Slesinsky 2016-03-09 12:59:46 -08:00
parent e85ac19134
commit ae009e0870
5 changed files with 50 additions and 18 deletions

View file

@ -1528,7 +1528,7 @@ class FixProcessor {
} }
// prepare LibraryElement // prepare LibraryElement
LibraryElement libraryElement = LibraryElement libraryElement =
context.getResult(librarySource, LIBRARY_ELEMENT8); context.getResult(librarySource, LIBRARY_ELEMENT4);
if (libraryElement == null) { if (libraryElement == null) {
continue; continue;
} }

View file

@ -64,6 +64,9 @@ class AbstractAnalysisTest {
AbstractAnalysisTest(); AbstractAnalysisTest();
AnalysisDomainHandler get analysisHandler => server.handlers
.singleWhere((handler) => handler is AnalysisDomainHandler);
void addAnalysisSubscription(AnalysisService service, String file) { void addAnalysisSubscription(AnalysisService service, String file) {
// add file to subscription // add file to subscription
var files = analysisSubscriptions[service]; var files = analysisSubscriptions[service];
@ -143,7 +146,7 @@ class AbstractAnalysisTest {
resourceProvider.newFolder(projectPath); resourceProvider.newFolder(projectPath);
Request request = Request request =
new AnalysisSetAnalysisRootsParams([projectPath], []).toRequest('0'); new AnalysisSetAnalysisRootsParams([projectPath], []).toRequest('0');
handleSuccessfulRequest(request); handleSuccessfulRequest(request, handler: analysisHandler);
} }
/** /**
@ -171,7 +174,8 @@ class AbstractAnalysisTest {
/** /**
* Validates that the given [request] is handled successfully. * Validates that the given [request] is handled successfully.
*/ */
Response handleSuccessfulRequest(Request request) { Response handleSuccessfulRequest(Request request, {RequestHandler handler}) {
handler ??= this.handler;
Response response = handler.handleRequest(request); Response response = handler.handleRequest(request);
expect(response, isResponseSuccess(request.id)); expect(response, isResponseSuccess(request.id));
return response; return response;
@ -203,8 +207,7 @@ class AbstractAnalysisTest {
packageMapProvider = new MockPackageMapProvider(); packageMapProvider = new MockPackageMapProvider();
Index index = createIndex(); Index index = createIndex();
server = createAnalysisServer(index); server = createAnalysisServer(index);
handler = server.handlers handler = analysisHandler;
.singleWhere((handler) => handler is AnalysisDomainHandler);
// listen for notifications // listen for notifications
Stream<Notification> notificationStream = Stream<Notification> notificationStream =
serverChannel.notificationController.stream; serverChannel.notificationController.stream;

View file

@ -27,13 +27,13 @@ class FixesTest extends AbstractAnalysisTest {
@override @override
void setUp() { void setUp() {
super.setUp(); super.setUp();
createProject();
ExtensionManager manager = new ExtensionManager(); ExtensionManager manager = new ExtensionManager();
manager.processPlugins([server.serverPlugin]); manager.processPlugins([server.serverPlugin]);
handler = new EditDomainHandler(server); handler = new EditDomainHandler(server);
} }
test_fixUndefinedClass() async { test_fixUndefinedClass() async {
createProject();
addTestFile(''' addTestFile('''
main() { main() {
Future<String> x = null; Future<String> x = null;
@ -52,6 +52,7 @@ main() {
} }
test_hasFixes() async { test_hasFixes() async {
createProject();
addTestFile(''' addTestFile('''
foo() { foo() {
print(1) print(1)
@ -77,19 +78,13 @@ bar() {
} }
test_overlayOnlyFile() async { test_overlayOnlyFile() async {
// add an overlay-only file createProject();
{ testCode = '''
testCode = '''
main() { main() {
print(1) print(1)
} }
'''; ''';
Request request = new AnalysisUpdateContentParams( _addOverlay(testFile, testCode);
{testFile: new AddContentOverlay(testCode)}).toRequest('0');
Response response =
new AnalysisDomainHandler(server).handleRequest(request);
expect(response, isResponseSuccess('0'));
}
// ask for fixes // ask for fixes
await waitForTasksFinished(); await waitForTasksFinished();
List<AnalysisErrorFixes> errorFixes = await _getFixesAt('print(1)'); List<AnalysisErrorFixes> errorFixes = await _getFixesAt('print(1)');
@ -97,6 +92,40 @@ main() {
_isSyntacticErrorWithSingleFix(errorFixes[0]); _isSyntacticErrorWithSingleFix(errorFixes[0]);
} }
test_suggestImportFromDifferentAnalysisRoot() async {
// Set up two projects.
resourceProvider..newFolder("/project1")..newFolder("/project2");
handleSuccessfulRequest(
new AnalysisSetAnalysisRootsParams(["/project1", "/project2"], [])
.toRequest('0'),
handler: analysisHandler);
// Set up files.
testFile = "/project1/main.dart";
testCode = "main() { print(new Foo()); }";
_addOverlay(testFile, testCode);
// Add another file in the same project that imports the target file.
// This ensures it will be analyzed as an implicit Source.
_addOverlay("/project1/another.dart", 'import "../project2/target.dart";');
_addOverlay("/project2/target.dart", "class Foo() {}");
await waitForTasksFinished();
List<String> fixes = (await _getFixesAt('Foo()'))
.single
.fixes
.map((f) => f.message)
.toList();
expect(fixes, contains("Import library '../project2/target.dart'"));
}
void _addOverlay(String name, String contents) {
Request request =
new AnalysisUpdateContentParams({name: new AddContentOverlay(contents)})
.toRequest('0');
handleSuccessfulRequest(request, handler: analysisHandler);
}
Future<List<AnalysisErrorFixes>> _getFixes(int offset) async { Future<List<AnalysisErrorFixes>> _getFixes(int offset) async {
Request request = new EditGetFixesParams(testFile, offset).toRequest('0'); Request request = new EditGetFixesParams(testFile, offset).toRequest('0');
Response response = await waitResponse(request); Response response = await waitResponse(request);

View file

@ -94,8 +94,8 @@ class AbstractSearchDomainTest extends AbstractAnalysisTest {
@override @override
void setUp() { void setUp() {
super.setUp(); super.setUp();
server.handlers = [new SearchDomainHandler(server),];
createProject(); createProject();
server.handlers = [new SearchDomainHandler(server),];
} }
Future waitForSearchResults() { Future waitForSearchResults() {

View file

@ -33,8 +33,8 @@ class GetTypeHierarchyTest extends AbstractAnalysisTest {
@override @override
void setUp() { void setUp() {
super.setUp(); super.setUp();
server.handlers = [new SearchDomainHandler(server),];
createProject(); createProject();
server.handlers = [new SearchDomainHandler(server),];
} }
test_bad_function() async { test_bad_function() async {