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
LibraryElement libraryElement =
context.getResult(librarySource, LIBRARY_ELEMENT8);
context.getResult(librarySource, LIBRARY_ELEMENT4);
if (libraryElement == null) {
continue;
}

View file

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

View file

@ -27,13 +27,13 @@ class FixesTest extends AbstractAnalysisTest {
@override
void setUp() {
super.setUp();
createProject();
ExtensionManager manager = new ExtensionManager();
manager.processPlugins([server.serverPlugin]);
handler = new EditDomainHandler(server);
}
test_fixUndefinedClass() async {
createProject();
addTestFile('''
main() {
Future<String> x = null;
@ -52,6 +52,7 @@ main() {
}
test_hasFixes() async {
createProject();
addTestFile('''
foo() {
print(1)
@ -77,19 +78,13 @@ bar() {
}
test_overlayOnlyFile() async {
// add an overlay-only file
{
testCode = '''
createProject();
testCode = '''
main() {
print(1)
print(1)
}
''';
Request request = new AnalysisUpdateContentParams(
{testFile: new AddContentOverlay(testCode)}).toRequest('0');
Response response =
new AnalysisDomainHandler(server).handleRequest(request);
expect(response, isResponseSuccess('0'));
}
_addOverlay(testFile, testCode);
// ask for fixes
await waitForTasksFinished();
List<AnalysisErrorFixes> errorFixes = await _getFixesAt('print(1)');
@ -97,6 +92,40 @@ main() {
_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 {
Request request = new EditGetFixesParams(testFile, offset).toRequest('0');
Response response = await waitResponse(request);

View file

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

View file

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