blob: e8807952700db3756b1373c3cad5274733483dff [file] [edit]
// Copyright (c) 2016, 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:analyzer/dart/analysis/analysis_options.dart';
import 'package:analyzer/source/file_source.dart';
import 'package:analyzer/source/source.dart';
import 'package:analyzer/src/dart/analysis/analysis_options.dart';
import 'package:analyzer/src/dart/analysis/session.dart';
import 'package:analyzer/src/dart/element/class_hierarchy.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
import 'package:analyzer/src/dart/element/type_provider.dart';
import 'package:analyzer/src/dart/element/type_system.dart';
import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
import 'package:analyzer/src/generated/source.dart'
show SourceFactory, UriResolver;
import 'package:analyzer/src/summary2/reference.dart';
import 'package:analyzer/src/test_utilities/mock_sdk_elements.dart';
import 'package:analyzer_testing/resource_provider_mixin.dart';
class TestAnalysisContext implements AnalysisContext {
final RootReference rootReference = RootReference();
@override
final SourceFactory sourceFactory;
final _MockAnalysisSession _analysisSession = _MockAnalysisSession();
final AnalysisOptions analysisOptions = AnalysisOptionsImpl();
late final LibraryElementImpl coreLibrary;
late final LibraryElementImpl asyncLibrary;
late TypeProviderImpl _typeProvider;
late TypeSystemImpl _typeSystem;
TestAnalysisContext(ResourceProviderMixin resources)
: sourceFactory = SourceFactory([_TestUriResolver(resources)]) {
var sdkElements = MockSdkElements(this, rootReference, _analysisSession);
coreLibrary = sdkElements.coreLibrary;
asyncLibrary = sdkElements.asyncLibrary;
_typeProvider = TypeProviderImpl(
coreLibrary: coreLibrary,
asyncLibrary: asyncLibrary,
);
_typeSystem = TypeSystemImpl(typeProvider: _typeProvider);
_setLibraryTypeSystem(coreLibrary);
_setLibraryTypeSystem(asyncLibrary);
}
AnalysisSessionImpl get analysisSession => _analysisSession;
TypeProviderImpl get typeProvider {
return _typeProvider;
}
TypeSystemImpl get typeSystem {
return _typeSystem;
}
@override
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
void _setLibraryTypeSystem(LibraryElementImpl libraryElement) {
libraryElement.typeProvider = _typeProvider;
libraryElement.typeSystem = _typeSystem;
}
}
class _MockAnalysisSession implements AnalysisSessionImpl {
@override
final ClassHierarchy classHierarchy = ClassHierarchy();
@override
final InheritanceManager3 inheritanceManager = InheritanceManager3();
@override
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
class _TestUriResolver implements UriResolver {
final ResourceProviderMixin resources;
_TestUriResolver(this.resources);
@override
Uri? pathToUri(String path) => null;
@override
Source? resolveAbsolute(Uri uri) {
var pathSegments = uri.pathSegments;
if (uri.isScheme('dart')) {
if (pathSegments case [var name]) {
var path = '/sdk/$name/$name.dart';
var file = resources.getFile(path);
return FileSource(file, uri);
} else {
var path = '/sdk/${pathSegments.join('/')}';
var file = resources.getFile(path);
return FileSource(file, uri);
}
} else if (uri.isScheme('package')) {
if (pathSegments.length >= 2) {
var packageName = pathSegments[0];
var rest = pathSegments.sublist(1).join('/');
var path = '/home/$packageName/lib/$rest';
var file = resources.getFile(path);
return FileSource(file, uri);
}
}
throw UnimplementedError('Unsupported URI: $uri');
}
}