blob: 023cfc9c2f4ea9d913be0110770e31a77c9b22d9 [file] [log] [blame]
// Copyright (c) 2014, 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.
library index;
import 'dart:async';
import 'dart:io';
import 'package:analysis_server/src/index/store/codec.dart';
import 'package:analysis_server/src/index/store/separate_file_manager.dart';
import 'package:analysis_server/src/index/store/split_store.dart';
import 'package:analyzer/src/generated/ast.dart';
import 'package:analyzer/src/generated/element.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/html.dart';
import 'package:analyzer/src/generated/index.dart';
import 'package:analyzer/src/generated/source.dart';
Index createLocalFileSplitIndex(Directory directory) {
var fileManager = new SeparateFileManager(directory);
var stringCodec = new StringCodec();
var nodeManager = new FileNodeManager(fileManager,
AnalysisEngine.instance.logger, stringCodec, new ContextCodec(),
new ElementCodec(stringCodec), new RelationshipCodec(stringCodec));
return new LocalIndex(nodeManager);
}
/**
* A local implementation of [Index].
*/
class LocalIndex extends Index {
SplitIndexStore _store;
LocalIndex(NodeManager nodeManager) {
_store = new SplitIndexStore(nodeManager);
}
@override
String get statistics => _store.statistics;
@override
void clear() {
_store.clear();
}
@override
void getRelationships(Element element, Relationship relationship,
RelationshipCallback callback) {
// TODO(scheglov) update Index API to use asynchronous interface
callback.hasRelationships(element, relationship, Location.EMPTY_ARRAY);
}
/**
* Returns a `Future<List<Location>>` that completes with the list of
* [Location]s of the given [relationship] with the given [element].
*
* For example, if the [element] represents a function and the [relationship]
* is the `is-invoked-by` relationship, then the locations will be all of the
* places where the function is invoked.
*/
Future<List<Location>> getRelationshipsAsync(Element element,
Relationship relationship) {
return _store.getRelationshipsAsync(element, relationship);
}
@override
void indexHtmlUnit(AnalysisContext context, HtmlUnit unit) {
if (unit == null) {
return;
}
if (unit.element == null) {
return;
}
new IndexHtmlUnitOperation(_store, context, unit).performOperation();
}
@override
void indexUnit(AnalysisContext context, CompilationUnit unit) {
if (unit == null) {
return;
}
if (unit.element == null) {
return;
}
new IndexUnitOperation(_store, context, unit).performOperation();
}
@override
void removeContext(AnalysisContext context) {
_store.removeContext(context);
}
@override
void removeSource(AnalysisContext context, Source source) {
_store.removeSource(context, source);
}
@override
void removeSources(AnalysisContext context, SourceContainer container) {
_store.removeSources(context, container);
}
@override
void run() {
// NO-OP if in the same isolate
}
@override
void stop() {
// NO-OP if in the same isolate
}
}