mirror of https://github.com/AMT-Cheif/drift.git
Plugin: Report navigation targets for import statements
This commit is contained in:
parent
ab787b82be
commit
1fc9ccb3cc
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue