blob: a9d7cf3fe07d61d779887b3d4a80dbe6cae9ecbc [file] [log] [blame]
// Copyright (c) 2020, 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_context.dart';
import 'package:analyzer/dart/analysis/context_root.dart';
import 'package:analyzer/dart/analysis/declared_variables.dart';
import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/dart/analysis/uri_converter.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/context/builder.dart';
import 'package:analyzer/src/dart/analysis/session.dart';
import 'package:analyzer/src/generated/engine.dart' show AnalysisOptions;
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/src/dart/analysis/results.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/dart/micro/resolve_file.dart';
import 'package:analyzer/src/workspace/workspace.dart';
class MicroAnalysisContextImpl implements AnalysisContext {
final FileResolver fileResolver;
@override
final AnalysisOptions analysisOptions;
final ResourceProvider resourceProvider;
@override
final ContextRoot contextRoot;
final DeclaredVariables declaredVariables;
final SourceFactory sourceFactory;
Workspace _workspace;
@override
Workspace get workspace {
return _workspace ??= _buildWorkspace();
}
MicroAnalysisContextImpl(
this.fileResolver,
this.contextRoot,
this.analysisOptions,
this.declaredVariables,
this.sourceFactory,
this.resourceProvider,
{Workspace workspace})
: this._workspace = workspace;
@override
AnalysisSession get currentSession {
return _AnalysisSessionImpl(this, declaredVariables, sourceFactory);
}
Workspace _buildWorkspace() {
String path = contextRoot.root.path;
ContextBuilder builder = ContextBuilder(
resourceProvider, null /* sdkManager */, null /* contentCache */);
return ContextBuilder.createWorkspace(resourceProvider, path, builder);
}
@override
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
class _AnalysisSessionImpl extends AnalysisSessionImpl {
@override
final MicroAnalysisContextImpl analysisContext;
@override
final DeclaredVariables declaredVariables;
@override
SourceFactory sourceFactory;
_AnalysisSessionImpl(
this.analysisContext,
this.declaredVariables,
this.sourceFactory,
) : super(null);
@override
ResourceProvider get resourceProvider =>
analysisContext.contextRoot.resourceProvider;
@override
FileResult getFile(String path) {
return FileResultImpl(
this,
path,
uriConverter.pathToUri(path),
null,
false,
);
}
@override
Future<ResolvedUnitResult> getResolvedUnit(String path) async {
return analysisContext.fileResolver.resolve(path);
}
@override
UriConverter get uriConverter {
return _UriConverterImpl(
analysisContext.contextRoot.resourceProvider,
sourceFactory,
);
}
@override
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
class _UriConverterImpl implements UriConverter {
final ResourceProvider resourceProvider;
final SourceFactory sourceFactory;
_UriConverterImpl(this.resourceProvider, this.sourceFactory);
@override
Uri pathToUri(String path, {String containingPath}) {
var fileUri = resourceProvider.pathContext.toUri(path);
var fileSource = sourceFactory.forUri2(fileUri);
return sourceFactory.restoreUri(fileSource);
}
@override
String uriToPath(Uri uri) {
return sourceFactory.forUri2(uri)?.fullName;
}
}