Plugin: Report navigation targets for import statements

This commit is contained in:
Simon Binder 2019-09-27 23:15:08 +02:00
parent ab787b82be
commit 1fc9ccb3cc
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
6 changed files with 90 additions and 10 deletions

View File

@ -12,10 +12,16 @@ void setupLogger(MoorPlugin plugin) {
Logger.root.level = Level.ALL;
Logger.root.onRecord.listen((LogRecord rec) {
if (rec.level >= Level.INFO) {
final isFatal = rec.level > Level.WARNING;
if (rec.level >= Level.WARNING) {
// when we send analysis errors, some tooling prompts users to create an
// issue on the Dart SDK repo for that. We're responsible for the problem
// though, so tell the user to not annoy the Dart Team with this.
final message = 'PLEASE DO NOT REPORT THIS ON dart-lang/sdk! '
'This should be reported via https://github.com/simolus3/moor/issues/new '
'instead. Message was ${rec.message}, error ${rec.error}';
final error =
PluginErrorParams(isFatal, rec.message, rec.stackTrace.toString());
PluginErrorParams(false, message, rec.stackTrace.toString());
plugin.channel.sendNotification(error.toNotification());
}

View File

@ -5,6 +5,7 @@ import 'package:analyzer_plugin/plugin/assist_mixin.dart';
import 'package:analyzer_plugin/plugin/completion_mixin.dart';
import 'package:analyzer_plugin/plugin/folding_mixin.dart';
import 'package:analyzer_plugin/plugin/highlights_mixin.dart';
import 'package:analyzer_plugin/plugin/navigation_mixin.dart';
import 'package:analyzer_plugin/plugin/outline_mixin.dart';
import 'package:analyzer_plugin/plugin/plugin.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
@ -12,6 +13,7 @@ import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:analyzer_plugin/utilities/completion/completion_core.dart';
import 'package:analyzer_plugin/utilities/folding/folding.dart';
import 'package:analyzer_plugin/utilities/highlights/highlights.dart';
import 'package:analyzer_plugin/utilities/navigation/navigation.dart';
import 'package:analyzer_plugin/utilities/outline/outline.dart';
import 'package:moor_generator/src/backends/plugin/backend/file_tracker.dart';
import 'package:moor_generator/src/backends/plugin/services/assists/assist_service.dart';
@ -19,6 +21,7 @@ import 'package:moor_generator/src/backends/plugin/services/autocomplete.dart';
import 'package:moor_generator/src/backends/plugin/services/errors.dart';
import 'package:moor_generator/src/backends/plugin/services/folding.dart';
import 'package:moor_generator/src/backends/plugin/services/highlights.dart';
import 'package:moor_generator/src/backends/plugin/services/navigation.dart';
import 'package:moor_generator/src/backends/plugin/services/outline.dart';
import 'package:moor_generator/src/backends/plugin/services/requests.dart';
@ -31,7 +34,8 @@ class MoorPlugin extends ServerPlugin
HighlightsMixin,
FoldingMixin,
CompletionMixin,
AssistsMixin {
AssistsMixin,
NavigationMixin {
MoorPlugin(ResourceProvider provider) : super(provider) {
setupLogger(this);
}
@ -154,7 +158,23 @@ class MoorPlugin extends ServerPlugin
final driver = _moorDriverForPath(path);
final file = await driver.waitFileParsed(path);
return MoorAssistRequest(
return MoorRequestAtPosition(
file, parameters.length, parameters.offset, resourceProvider);
}
@override
List<NavigationContributor> getNavigationContributors(String path) {
return const [MoorNavigationContributor()];
}
@override
Future<NavigationRequest> getNavigationRequest(
plugin.AnalysisGetNavigationParams parameters) async {
final path = parameters.file;
final driver = _moorDriverForPath(path);
final file = await driver.waitFileParsed(path);
return MoorRequestAtPosition(
file, parameters.length, parameters.offset, resourceProvider);
}
}

View File

@ -13,7 +13,7 @@ class AssistService implements AssistContributor {
@override
void computeAssists(AssistRequest request, AssistCollector collector) {
final moorRequest = request as MoorAssistRequest;
final moorRequest = request as MoorRequestAtPosition;
if (moorRequest.isMoorAndParsed) {
final parseResult = moorRequest.parsedMoor.parseResult;

View File

@ -28,7 +28,7 @@ class _FoldingVisitor extends RecursiveVisitor<void> {
// construct a folding region for import statements
final imports = e.imports.toList();
if (imports.length > 1) {
final first = imports[1].firstPosition;
final first = imports.first.firstPosition;
final last = imports.last.lastPosition;
collector.addRegion(first, last - first, FoldingKind.DIRECTIVES);

View File

@ -0,0 +1,49 @@
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/utilities/navigation/navigation.dart';
import 'package:moor_generator/src/backends/plugin/services/requests.dart';
import 'package:sqlparser/sqlparser.dart';
class MoorNavigationContributor implements NavigationContributor {
const MoorNavigationContributor();
@override
void computeNavigation(
NavigationRequest request, NavigationCollector collector) {
final moorRequest = request as MoorRequestAtPosition;
final visitor = _NavigationVisitor(moorRequest, collector);
if (moorRequest.file.isParsed) {
moorRequest.parsedMoor.parsedFile.accept(visitor);
}
}
}
class _NavigationVisitor extends RecursiveVisitor<void> {
final MoorRequestAtPosition request;
final NavigationCollector collector;
_NavigationVisitor(this.request, this.collector);
@override
void visitMoorImportStatement(ImportStatement e) {
if (request.isMoorAndParsed) {
final moor = request.parsedMoor;
final resolved = moor.resolvedImports[e];
if (resolved != null) {
final span = e.importString.span;
final offset = span.start.offset;
final length = span.end.offset - offset;
collector.addRegion(
offset,
length,
ElementKind.FILE,
Location(resolved.uri.path, 0, 0, 1, 1),
);
}
}
super.visitChildren(e);
}
}

View File

@ -3,6 +3,7 @@ import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:analyzer_plugin/utilities/completion/completion_core.dart';
import 'package:analyzer_plugin/utilities/folding/folding.dart';
import 'package:analyzer_plugin/utilities/highlights/highlights.dart';
import 'package:analyzer_plugin/utilities/navigation/navigation.dart';
import 'package:analyzer_plugin/utilities/outline/outline.dart';
import 'package:moor_generator/src/analyzer/runner/file_graph.dart';
import 'package:moor_generator/src/analyzer/runner/results.dart';
@ -10,7 +11,8 @@ import 'package:moor_generator/src/analyzer/runner/results.dart';
mixin _MoorBaseRequest {
FoundFile get file;
bool get isMoorAndParsed => file.type == FileType.moor && file.isParsed;
bool get isMoor => file.type == FileType.moor;
bool get isMoorAndParsed => isMoor && file.isParsed;
String get path => file.uri.path;
@ -49,7 +51,9 @@ class MoorCompletionRequest extends CompletionRequest with _MoorBaseRequest {
MoorCompletionRequest(this.offset, this.resourceProvider, this.file);
}
class MoorAssistRequest extends AssistRequest with _MoorBaseRequest {
class MoorRequestAtPosition
with _MoorBaseRequest
implements AssistRequest, NavigationRequest {
@override
final FoundFile file;
@ -62,5 +66,6 @@ class MoorAssistRequest extends AssistRequest with _MoorBaseRequest {
@override
final ResourceProvider resourceProvider;
MoorAssistRequest(this.file, this.length, this.offset, this.resourceProvider);
MoorRequestAtPosition(
this.file, this.length, this.offset, this.resourceProvider);
}