| Index: pkg/analyzer/test/src/dart/analysis/driver_test.dart
|
| diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
|
| index dff172eca02b1d7382782aa20f7da763007475d1..409802f1a7fa88a2d26d8f6071403404aad3daa5 100644
|
| --- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
|
| +++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
|
| @@ -8,6 +8,7 @@ import 'dart:async';
|
| import 'dart:convert';
|
|
|
| import 'package:analyzer/dart/ast/ast.dart';
|
| +import 'package:analyzer/dart/element/element.dart';
|
| import 'package:analyzer/error/error.dart';
|
| import 'package:analyzer/file_system/file_system.dart';
|
| import 'package:analyzer/file_system/memory_file_system.dart';
|
| @@ -75,7 +76,8 @@ class DriverTest {
|
| new DartUriResolver(sdk),
|
| new PackageMapUriResolver(provider, <String, List<Folder>>{
|
| 'test': [provider.getFolder(testProject)]
|
| - })
|
| + }),
|
| + new ResourceUriResolver(provider)
|
| ], null, provider),
|
| new AnalysisOptionsImpl()..strongMode = true);
|
| driver.status.lastWhere((status) {
|
| @@ -287,6 +289,94 @@ class C {
|
| expect(_getClassFieldType(result.unit, 'C', 'f'), 'int');
|
| }
|
|
|
| + test_getResult_sameFile_twoUris() async {
|
| + var a = _p('/test/lib/a.dart');
|
| + var b = _p('/test/lib/b.dart');
|
| + var c = _p('/test/test/c.dart');
|
| + provider.newFile(a, 'class A<T> {}');
|
| + provider.newFile(
|
| + b,
|
| + r'''
|
| +import 'a.dart';
|
| +var VB = new A<int>();
|
| +''');
|
| + provider.newFile(
|
| + c,
|
| + r'''
|
| +import '../lib/a.dart';
|
| +var VC = new A<double>();
|
| +''');
|
| +
|
| + driver.addFile(a);
|
| + driver.addFile(b);
|
| + await _waitForIdle();
|
| +
|
| + {
|
| + AnalysisResult result = await driver.getResult(b);
|
| + expect(_getImportSource(result.unit, 0).uri.toString(),
|
| + 'package:test/a.dart');
|
| + expect(_getTopLevelVarType(result.unit, 'VB'), 'A<int>');
|
| + }
|
| +
|
| + {
|
| + AnalysisResult result = await driver.getResult(c);
|
| + expect(_getImportSource(result.unit, 0).uri.toString(),
|
| + 'file:///test/lib/a.dart');
|
| + expect(_getTopLevelVarType(result.unit, 'VC'), 'A<double>');
|
| + }
|
| + }
|
| +
|
| + test_getResult_mix_fileAndPackageUris() async {
|
| + var a = _p('/test/bin/a.dart');
|
| + var b = _p('/test/bin/b.dart');
|
| + var c = _p('/test/lib/c.dart');
|
| + var d = _p('/test/test/d.dart');
|
| + provider.newFile(
|
| + a,
|
| + r'''
|
| +import 'package:test/c.dart';
|
| +int x = y;
|
| +''');
|
| + provider.newFile(
|
| + b,
|
| + r'''
|
| +import '../lib/c.dart';
|
| +int x = y;
|
| +''');
|
| + provider.newFile(
|
| + c,
|
| + r'''
|
| +import '../test/d.dart';
|
| +var y = z;
|
| +''');
|
| + provider.newFile(
|
| + d,
|
| + r'''
|
| +String z = "string";
|
| +''');
|
| +
|
| + // Analysis of my_pkg/bin/a.dart produces no error because
|
| + // file:///my_pkg/bin/a.dart imports package:my_pkg/c.dart, and
|
| + // package:my_pkg/c.dart's import is erroneous, causing y's reference to z
|
| + // to be unresolved (and therefore have type dynamic).
|
| + {
|
| + AnalysisResult result = await driver.getResult(a);
|
| + expect(result.errors, isEmpty);
|
| + }
|
| +
|
| + // Analysis of my_pkg/bin/b.dart produces the error "A value of type
|
| + // 'String' can't be assigned to a variable of type 'int'", because
|
| + // file:///my_pkg/bin/b.dart imports file:///my_pkg/lib/c.dart, which
|
| + // successfully imports file:///my_pkg/test/d.dart, causing y to have an
|
| + // inferred type of String.
|
| + {
|
| + AnalysisResult result = await driver.getResult(b);
|
| + List<AnalysisError> errors = result.errors;
|
| + expect(errors, hasLength(1));
|
| + expect(errors[0].errorCode, StaticTypeWarningCode.INVALID_ASSIGNMENT);
|
| + }
|
| + }
|
| +
|
| test_getResult_selfConsistent() async {
|
| var a = _p('/test/lib/a.dart');
|
| var b = _p('/test/lib/b.dart');
|
| @@ -549,6 +639,15 @@ var A = B;
|
| return _getClassField(unit, className, fieldName).element.type.toString();
|
| }
|
|
|
| + ImportElement _getImportElement(CompilationUnit unit, int directiveIndex) {
|
| + var import = unit.directives[directiveIndex] as ImportDirective;
|
| + return import.element as ImportElement;
|
| + }
|
| +
|
| + Source _getImportSource(CompilationUnit unit, int directiveIndex) {
|
| + return _getImportElement(unit, directiveIndex).importedLibrary.source;
|
| + }
|
| +
|
| VariableDeclaration _getTopLevelVar(CompilationUnit unit, String name) {
|
| for (CompilationUnitMember declaration in unit.declarations) {
|
| if (declaration is TopLevelVariableDeclaration) {
|
|
|