56e5655353
Change-Id: Iaeb2152d47df05434ab470901900da56cae7e792 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/196125 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
176 lines
5.5 KiB
Dart
176 lines
5.5 KiB
Dart
// Copyright (c) 2019, 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:analysis_server/lsp_protocol/protocol_generated.dart';
|
|
import 'package:test/test.dart';
|
|
import 'package:test_reflective_loader/test_reflective_loader.dart';
|
|
|
|
import 'server_abstract.dart';
|
|
|
|
void main() {
|
|
defineReflectiveSuite(() {
|
|
defineReflectiveTests(OutlineTest);
|
|
});
|
|
}
|
|
|
|
@reflectiveTest
|
|
class OutlineTest extends AbstractLspAnalysisServerTest {
|
|
Future<void> test_afterChange() async {
|
|
final initialContent = 'class A {}';
|
|
final updatedContent = 'class B {}';
|
|
await initialize(initializationOptions: {'outline': true});
|
|
|
|
final outlineUpdateBeforeChange = waitForOutline(mainFileUri);
|
|
openFile(mainFileUri, initialContent);
|
|
final outlineBeforeChange = await outlineUpdateBeforeChange;
|
|
|
|
final outlineUpdateAfterChange = waitForOutline(mainFileUri);
|
|
replaceFile(1, mainFileUri, updatedContent);
|
|
final outlineAfterChange = await outlineUpdateAfterChange;
|
|
|
|
expect(outlineBeforeChange, isNotNull);
|
|
expect(outlineBeforeChange.children, hasLength(1));
|
|
expect(outlineBeforeChange.children![0].element.name, equals('A'));
|
|
|
|
expect(outlineAfterChange, isNotNull);
|
|
expect(outlineAfterChange.children, hasLength(1));
|
|
expect(outlineAfterChange.children![0].element.name, equals('B'));
|
|
}
|
|
|
|
Future<void> test_extensions() async {
|
|
final initialContent = '''
|
|
extension StringExtensions on String {}
|
|
extension on String {}
|
|
''';
|
|
await initialize(initializationOptions: {'outline': true});
|
|
|
|
final outlineUpdate = waitForOutline(mainFileUri);
|
|
openFile(mainFileUri, initialContent);
|
|
final outline = await outlineUpdate;
|
|
|
|
expect(outline, isNotNull);
|
|
expect(outline.children, hasLength(2));
|
|
expect(outline.children![0].element.name, equals('StringExtensions'));
|
|
expect(outline.children![1].element.name, equals('<unnamed extension>'));
|
|
}
|
|
|
|
Future<void> test_initial() async {
|
|
final content = '''
|
|
/// a
|
|
class A {
|
|
/// b
|
|
b() {
|
|
/// c
|
|
c() {}
|
|
}
|
|
|
|
/// d
|
|
num get d => 1;
|
|
}
|
|
''';
|
|
await initialize(initializationOptions: {'outline': true});
|
|
|
|
final outlineNotification = waitForOutline(mainFileUri);
|
|
openFile(mainFileUri, content);
|
|
final outline = await outlineNotification;
|
|
|
|
expect(outline, isNotNull);
|
|
|
|
// Root node is entire document
|
|
expect(
|
|
outline.range,
|
|
equals(Range(
|
|
start: Position(line: 0, character: 0),
|
|
end: Position(line: 11, character: 0))));
|
|
expect(outline.children, hasLength(1));
|
|
|
|
// class A
|
|
final classA = outline.children![0];
|
|
expect(classA.element.name, equals('A'));
|
|
expect(classA.element.kind, equals('CLASS'));
|
|
expect(
|
|
classA.element.range,
|
|
equals(Range(
|
|
start: Position(line: 1, character: 6),
|
|
end: Position(line: 1, character: 7))));
|
|
expect(
|
|
classA.range,
|
|
equals(Range(
|
|
start: Position(line: 0, character: 0),
|
|
end: Position(line: 10, character: 1))));
|
|
expect(
|
|
classA.codeRange,
|
|
equals(Range(
|
|
start: Position(line: 1, character: 0),
|
|
end: Position(line: 10, character: 1))));
|
|
expect(classA.children, hasLength(2));
|
|
|
|
// b()
|
|
final methodB = classA.children![0];
|
|
expect(methodB.element.name, equals('b'));
|
|
expect(methodB.element.kind, equals('METHOD'));
|
|
expect(
|
|
methodB.element.range,
|
|
equals(Range(
|
|
start: Position(line: 3, character: 2),
|
|
end: Position(line: 3, character: 3))));
|
|
expect(
|
|
methodB.range,
|
|
equals(Range(
|
|
start: Position(line: 2, character: 2),
|
|
end: Position(line: 6, character: 3))));
|
|
expect(
|
|
methodB.codeRange,
|
|
equals(Range(
|
|
start: Position(line: 3, character: 2),
|
|
end: Position(line: 6, character: 3))));
|
|
expect(methodB.children, hasLength(1));
|
|
|
|
// c()
|
|
final methodC = methodB.children![0];
|
|
expect(methodC.element.name, equals('c'));
|
|
expect(methodC.element.kind, equals('FUNCTION'));
|
|
expect(
|
|
methodC.element.range,
|
|
equals(Range(
|
|
start: Position(line: 5, character: 4),
|
|
end: Position(line: 5, character: 5))));
|
|
// TODO(dantup): This one seems to be excluding its dartdoc?
|
|
// should be line 4 for the starting range.
|
|
// https://github.com/dart-lang/sdk/issues/39746
|
|
expect(
|
|
methodC.range,
|
|
equals(Range(
|
|
start: Position(line: 5, character: 4),
|
|
end: Position(line: 5, character: 10))));
|
|
expect(
|
|
methodC.codeRange,
|
|
equals(Range(
|
|
start: Position(line: 5, character: 4),
|
|
end: Position(line: 5, character: 10))));
|
|
expect(methodC.children, isNull);
|
|
|
|
// num get d
|
|
final fieldD = classA.children![1];
|
|
expect(fieldD.element.name, equals('d'));
|
|
expect(fieldD.element.kind, equals('GETTER'));
|
|
expect(
|
|
fieldD.element.range,
|
|
equals(Range(
|
|
start: Position(line: 9, character: 10),
|
|
end: Position(line: 9, character: 11))));
|
|
expect(
|
|
fieldD.range,
|
|
equals(Range(
|
|
start: Position(line: 8, character: 2),
|
|
end: Position(line: 9, character: 17))));
|
|
expect(
|
|
fieldD.codeRange,
|
|
equals(Range(
|
|
start: Position(line: 9, character: 2),
|
|
end: Position(line: 9, character: 17))));
|
|
expect(fieldD.children, isNull);
|
|
}
|
|
}
|