diff --git a/pkg/analysis_server/test/analysis/get_navigation_test.dart b/pkg/analysis_server/test/analysis/get_navigation_test.dart index 227a3c99ea9..c2d02412f6a 100644 --- a/pkg/analysis_server/test/analysis/get_navigation_test.dart +++ b/pkg/analysis_server/test/analysis/get_navigation_test.dart @@ -43,6 +43,27 @@ main() { assertHasTarget('test = 0'); } + test_fieldType() async { + // This test mirrors test_navigation() from + // test/integration/analysis/get_navigation_test.dart + String text = r''' +class Foo {} + +class Bar { + Foo foo; +} +'''; + addTestFile(text); + await _getNavigation(testFile, text.indexOf('Foo foo'), 0); + expect(targets, hasLength(1)); + NavigationTarget target = targets.first; + expect(target.kind, ElementKind.CLASS); + expect(target.offset, text.indexOf('Foo {')); + expect(target.length, 3); + expect(target.startLine, 1); + expect(target.startColumn, 7); + } + test_fileDoesNotExist() async { String file = '$projectPath/doesNotExist.dart'; Request request = _createGetNavigationRequest(file, 0, 100); diff --git a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart index 785e4dd8c0f..8901f8e79ba 100644 --- a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart +++ b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart @@ -72,10 +72,6 @@ class GetNavigationTest_UseCFE extends GetNavigationTest { @override bool get useCFE => true; - @override - @failingTest - test_navigation() => super.test_navigation(); - @override @failingTest test_navigation_no_result() => super.test_navigation_no_result(); diff --git a/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart b/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart index f2a926a190a..5208c15173b 100644 --- a/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart +++ b/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart @@ -90,6 +90,7 @@ class KernelContext { // Remember Kernel libraries produced by the compiler. // There might be more libraries than we actually need. // This is probably OK, because we consume them lazily. + var lineInfoMap = {}; var libraryMap = {}; var libraryExistMap = {}; bool coreFound = false; @@ -98,8 +99,9 @@ class KernelContext { if (uriStr == 'dart:core') { coreFound = true; } - libraryMap[uriStr] = library; FileState file = fsState.getFileForUri(library.importUri); + lineInfoMap[uriStr] = file?.lineInfo ?? new LineInfo([0]); + libraryMap[uriStr] = library; libraryExistMap[uriStr] = file?.exists ?? false; } if (!coreFound) { @@ -123,8 +125,8 @@ class KernelContext { analysisContext.contentCache = new _ContentCacheWrapper(fsState); // Create the resynthesizer bound to the analysis context. - var resynthesizer = - new KernelResynthesizer(analysisContext, libraryMap, libraryExistMap); + var resynthesizer = new KernelResynthesizer( + analysisContext, lineInfoMap, libraryMap, libraryExistMap); return new KernelContext._(analysisContext, resynthesizer); }); diff --git a/pkg/analyzer/lib/src/kernel/resynthesize.dart b/pkg/analyzer/lib/src/kernel/resynthesize.dart index 0fd66d005d3..c71215b922c 100644 --- a/pkg/analyzer/lib/src/kernel/resynthesize.dart +++ b/pkg/analyzer/lib/src/kernel/resynthesize.dart @@ -7,6 +7,7 @@ import 'package:analyzer/dart/ast/standard_ast_factory.dart'; import 'package:analyzer/dart/ast/token.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; +import 'package:analyzer/source/line_info.dart'; import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl; import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/dart/element/handle.dart'; @@ -30,6 +31,7 @@ import 'package:path/path.dart' as pathos; */ class KernelResynthesizer implements ElementResynthesizer { final AnalysisContextImpl _analysisContext; + final Map _lineInfoMap; final Map _kernelMap; final Map _libraryExistMap; final Map _libraryMap = {}; @@ -42,8 +44,8 @@ class KernelResynthesizer implements ElementResynthesizer { /// The type provider for this resynthesizer. SummaryTypeProvider _typeProvider; - KernelResynthesizer( - this._analysisContext, this._kernelMap, this._libraryExistMap) { + KernelResynthesizer(this._analysisContext, this._lineInfoMap, this._kernelMap, + this._libraryExistMap) { _buildTypeProvider(); _analysisContext.typeProvider = _typeProvider; } @@ -200,14 +202,18 @@ class KernelResynthesizer implements ElementResynthesizer { // Build the defining unit. var definingUnit = libraryContext._buildUnit(null).unit; + definingUnit.lineInfo = _lineInfoMap[uriStr]; libraryElement.definingCompilationUnit = definingUnit; // Build units for parts. var parts = new List(kernel.parts.length); for (int i = 0; i < kernel.parts.length; i++) { - var fileUri = kernel.fileUri.resolve(kernel.parts[i].partUri); - var unitContext = libraryContext._buildUnit("$fileUri"); - parts[i] = unitContext.unit; + var fileUriStr = + kernel.fileUri.resolve(kernel.parts[i].partUri).toString(); + var unitContext = libraryContext._buildUnit(fileUriStr); + var partUnit = unitContext.unit; + partUnit.lineInfo = _lineInfoMap[fileUriStr]; + parts[i] = partUnit; } libraryElement.parts = parts; diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart index d2a477d176c..46ad634edc8 100644 --- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart +++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart @@ -287,12 +287,14 @@ class C { LibraryCompilationResult libraryResult = await compiler.compile(testUri); // Remember Kernel libraries produced by the compiler. + var lineInfoMap = {}; var libraryMap = {}; var libraryExistMap = {}; for (var library in libraryResult.component.libraries) { String uriStr = library.importUri.toString(); - libraryMap[uriStr] = library; FileState file = fsState.getFileForUri(library.importUri); + lineInfoMap[uriStr] = file?.lineInfo ?? new LineInfo([0]); + libraryMap[uriStr] = library; libraryExistMap[uriStr] = file?.exists ?? false; } @@ -302,8 +304,8 @@ class C { print(_getLibraryText(library)); } - var resynthesizer = - new KernelResynthesizer(context, libraryMap, libraryExistMap); + var resynthesizer = new KernelResynthesizer( + context, lineInfoMap, libraryMap, libraryExistMap); return resynthesizer; }