ec4ffb99f5
I found that the issue with Dart indexer is related to flushing partially resolved ASTs from the cache, which we don't handle correctly. Instead of trying to fix the issue, we can just increase the cache size and make indexer work for now. Eventually we should migrate to AnalysisDriver, which does not have this problem. R=brianwilkerson@google.com, jwren@google.com Bug: Change-Id: I7515fd132245c361e030ddf1bfa7e06f11b6f3a4 Reviewed-on: https://dart-review.googlesource.com/18422 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
185 lines
5.9 KiB
Dart
185 lines
5.9 KiB
Dart
// Copyright (c) 2015, 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 analyzer.task.dart;
|
|
|
|
import 'package:analyzer/dart/ast/ast.dart';
|
|
import 'package:analyzer/dart/ast/token.dart';
|
|
import 'package:analyzer/dart/element/element.dart';
|
|
import 'package:analyzer/error/error.dart';
|
|
import 'package:analyzer/src/generated/source.dart';
|
|
import 'package:analyzer/src/generated/utilities_general.dart';
|
|
import 'package:analyzer/src/task/dart.dart';
|
|
import 'package:analyzer/task/model.dart';
|
|
|
|
/**
|
|
* The analysis errors associated with a [Source] representing a compilation
|
|
* unit.
|
|
*/
|
|
final ListResultDescriptor<AnalysisError> DART_ERRORS =
|
|
new ListResultDescriptor<AnalysisError>(
|
|
'DART_ERRORS', AnalysisError.NO_ERRORS);
|
|
|
|
/**
|
|
* The sources of the libraries that are explicitly imported into a library.
|
|
*
|
|
* The list will be empty if there are no explicit imports, but will not be
|
|
* `null`.
|
|
*
|
|
* The result is only available for [Source]s representing a library.
|
|
*/
|
|
final ListResultDescriptor<Source> EXPLICITLY_IMPORTED_LIBRARIES =
|
|
new ListResultDescriptor<Source>(
|
|
'EXPLICITLY_IMPORTED_LIBRARIES', Source.EMPTY_LIST);
|
|
|
|
/**
|
|
* The sources of the libraries that are exported from a library.
|
|
*
|
|
* The list will be empty if there are no exported libraries, but will not be
|
|
* `null`.
|
|
*
|
|
* The result is only available for [Source]s representing a library.
|
|
*/
|
|
final ListResultDescriptor<Source> EXPORTED_LIBRARIES =
|
|
new ListResultDescriptor<Source>('EXPORTED_LIBRARIES', Source.EMPTY_LIST);
|
|
|
|
/**
|
|
* The sources of the libraries that are implicitly or explicitly imported into
|
|
* a library.
|
|
*
|
|
* The list will minimally contain the source for `dart:core` because it is
|
|
* implicitly imported into every library, and therefore will never be `null`.
|
|
*
|
|
* The result is only available for [Source]s representing a library.
|
|
*/
|
|
final ListResultDescriptor<Source> IMPORTED_LIBRARIES =
|
|
new ListResultDescriptor<Source>('IMPORTED_LIBRARIES', Source.EMPTY_LIST);
|
|
|
|
/**
|
|
* The sources of the parts that are included in a library.
|
|
*
|
|
* The list will be empty if there are no parts, but will not be `null`. The
|
|
* list does *not* include the source for the defining compilation unit.
|
|
*
|
|
* The result is only available for [Source]s representing a library.
|
|
*/
|
|
final ListResultDescriptor<Source> INCLUDED_PARTS =
|
|
new ListResultDescriptor<Source>('INCLUDED_PARTS', Source.EMPTY_LIST);
|
|
|
|
/**
|
|
* A flag specifying whether a library is launchable.
|
|
*
|
|
* The result is only available for [Source]s representing a library.
|
|
*/
|
|
final ResultDescriptor<bool> IS_LAUNCHABLE =
|
|
new ResultDescriptor<bool>('IS_LAUNCHABLE', false);
|
|
|
|
/**
|
|
* The fully built [LibraryElement] associated with a library.
|
|
*
|
|
* The result is only available for [Source]s representing a library.
|
|
*/
|
|
final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT =
|
|
new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT', null);
|
|
|
|
/**
|
|
* The compilation unit AST produced while parsing a compilation unit.
|
|
*
|
|
* The AST structure will not have resolution information associated with it.
|
|
*
|
|
* The result is only available for [Source]s representing a compilation unit.
|
|
*/
|
|
final ResultDescriptor<CompilationUnit> PARSED_UNIT =
|
|
new ResultDescriptor<CompilationUnit>('PARSED_UNIT', null,
|
|
cachingPolicy: AST_CACHING_POLICY);
|
|
|
|
/**
|
|
* The resolved [CompilationUnit] associated with a compilation unit, with
|
|
* constants resolved.
|
|
*
|
|
* The result is only available for [LibrarySpecificUnit]s.
|
|
*/
|
|
final ResultDescriptor<CompilationUnit> RESOLVED_UNIT =
|
|
new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT', null,
|
|
cachingPolicy: AST_CACHING_POLICY);
|
|
|
|
/**
|
|
* The kind of a [Source].
|
|
*/
|
|
final ResultDescriptor<SourceKind> SOURCE_KIND =
|
|
new ResultDescriptor<SourceKind>('SOURCE_KIND', SourceKind.UNKNOWN);
|
|
|
|
/**
|
|
* The token stream produced while scanning a compilation unit.
|
|
*
|
|
* The value is the first token in the file, or the special end-of-file marker
|
|
* at the end of the stream if the file does not contain any tokens.
|
|
*
|
|
* The result is only available for [Source]s representing a compilation unit.
|
|
*/
|
|
final ResultDescriptor<Token> TOKEN_STREAM = new ResultDescriptor<Token>(
|
|
'TOKEN_STREAM', null,
|
|
cachingPolicy: TOKEN_STREAM_CACHING_POLICY);
|
|
|
|
/**
|
|
* The sources of the Dart files that a library consists of.
|
|
*
|
|
* The list will include the source of the defining unit and [INCLUDED_PARTS].
|
|
* So, it is never empty or `null`.
|
|
*
|
|
* The result is only available for [Source]s representing a library.
|
|
*/
|
|
final ListResultDescriptor<Source> UNITS =
|
|
new ListResultDescriptor<Source>('UNITS', Source.EMPTY_LIST);
|
|
|
|
/**
|
|
* A specific compilation unit in a specific library.
|
|
*
|
|
* This kind of target is associated with information about a compilation unit
|
|
* that differs based on the library that the unit is a part of. For example,
|
|
* the result of resolving a compilation unit depends on the imports, which can
|
|
* change if a single part is included in more than one library.
|
|
*/
|
|
class LibrarySpecificUnit implements AnalysisTarget {
|
|
static const List<LibrarySpecificUnit> EMPTY_LIST =
|
|
const <LibrarySpecificUnit>[];
|
|
|
|
/**
|
|
* The defining compilation unit of the library in which the [unit]
|
|
* is analyzed.
|
|
*/
|
|
final Source library;
|
|
|
|
/**
|
|
* The compilation unit which belongs to the [library].
|
|
*/
|
|
final Source unit;
|
|
|
|
/**
|
|
* Initialize a newly created target for the [unit] in the [library].
|
|
*/
|
|
LibrarySpecificUnit(this.library, this.unit);
|
|
|
|
@override
|
|
int get hashCode {
|
|
return JenkinsSmiHash.combine(library.hashCode, unit.hashCode);
|
|
}
|
|
|
|
@override
|
|
Source get librarySource => library;
|
|
|
|
@override
|
|
Source get source => unit;
|
|
|
|
@override
|
|
bool operator ==(other) {
|
|
return other is LibrarySpecificUnit &&
|
|
other.library == library &&
|
|
other.unit == unit;
|
|
}
|
|
|
|
@override
|
|
String toString() => '$unit in $library';
|
|
}
|