blob: 75e74a338724c7faf0076dd8b35040b94f087529 [file] [log] [blame] [edit]
// 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.
/// Defines static information collected by the type checker and used later by
/// emitters to generate code.
library dev_compiler.src.info;
import 'package:analyzer/src/generated/ast.dart';
import 'package:analyzer/src/generated/element.dart';
import 'package:analyzer/src/generated/parser.dart';
import 'utils.dart' as utils;
import 'package:analyzer/src/task/strong/info.dart';
export 'package:analyzer/src/task/strong/info.dart';
/// Represents a summary of the results collected by running the program
/// checker.
class CheckerResults {
final List<LibraryInfo> libraries;
final bool failure;
CheckerResults(this.libraries, this.failure);
}
/// Computed information about each library.
class LibraryInfo {
/// Canonical name of the library. This is unfortunately not derived from the
/// library directive as it doesn't have any meaningful rules enforced.
/// Instead, this is inferred from the path to the file defining the library.
final String name;
/// Corresponding analyzer element.
final LibraryElement library;
LibraryInfo(library)
: library = library,
name = utils.canonicalLibraryName(library);
}
class LibraryUnit {
final CompilationUnit library;
final List<CompilationUnit> parts;
LibraryUnit(this.library, this.parts);
Iterable<CompilationUnit> get libraryThenParts sync* {
yield library;
yield* parts;
}
Iterable<CompilationUnit> get partsThenLibrary sync* {
yield* parts;
yield library;
}
/// Creates a clone of this library's AST.
LibraryUnit clone() {
return new LibraryUnit(
_cloneUnit(library), parts.map(_cloneUnit).toList(growable: false));
}
static CompilationUnit _cloneUnit(CompilationUnit oldNode) {
var newNode = oldNode.accept(new _AstCloner());
ResolutionCopier.copyResolutionData(oldNode, newNode);
return newNode;
}
}
class _AstCloner extends AstCloner {
void _cloneProperties(AstNode clone, AstNode node) {
if (clone != null) {
CoercionInfo.set(clone, CoercionInfo.get(node));
DynamicInvoke.set(clone, DynamicInvoke.get(node));
}
}
@override
AstNode cloneNode(AstNode node) {
var clone = super.cloneNode(node);
_cloneProperties(clone, node);
return clone;
}
@override
List cloneNodeList(List list) {
var clone = super.cloneNodeList(list);
for (int i = 0, len = list.length; i < len; i++) {
_cloneProperties(clone[i], list[i]);
}
return clone;
}
// TODO(jmesserly): as a workaround for analyzer <0.26.0-alpha.1.
// ResolutionCopier won't copy the type, so we do it here.
@override
AwaitExpression visitAwaitExpression(AwaitExpression node) {
var clone = super.visitAwaitExpression(node);
clone.staticType = node.staticType;
clone.propagatedType = node.propagatedType;
return clone;
}
}