blob: 4e4cc1ef416f150348c1b2dc222566546b50bb10 [file] [log] [blame]
// 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.
library analyzer.test.src.summary.summarize_ast_test;
import 'package:analyzer/analyzer.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/src/dart/scanner/reader.dart';
import 'package:analyzer/src/dart/scanner/scanner.dart';
import 'package:analyzer/src/generated/error.dart';
import 'package:analyzer/src/generated/parser.dart';
import 'package:analyzer/src/summary/idl.dart';
import 'package:analyzer/src/summary/prelink.dart';
import 'package:analyzer/src/summary/summarize_ast.dart';
import 'package:unittest/unittest.dart';
import '../../reflective_tests.dart';
import 'summary_common.dart';
main() {
groupSep = ' | ';
runReflectiveTests(UnlinkedSummarizeAstTest);
}
/**
* Override of [SummaryTest] which creates unlinked summaries directly from the
* AST.
*/
@reflectiveTest
class UnlinkedSummarizeAstTest extends Object with SummaryTest {
@override
LinkedLibrary linked;
@override
List<UnlinkedUnit> unlinkedUnits;
/**
* Map from absolute URI to the [UnlinkedUnit] for each compilation unit
* passed to [addNamedSource].
*/
Map<String, UnlinkedUnit> uriToUnit = <String, UnlinkedUnit>{};
@override
bool get checkAstDerivedData => true;
@override
bool get expectAbsoluteUrisInDependencies => false;
@override
bool get skipFullyLinkedData => true;
@override
bool get strongMode => false;
@override
addNamedSource(String filePath, String contents) {
CompilationUnit unit = _parseText(contents);
UnlinkedUnit unlinkedUnit =
new UnlinkedUnit.fromBuffer(serializeAstUnlinked(unit).toBuffer());
uriToUnit[absUri(filePath)] = unlinkedUnit;
}
@override
void serializeLibraryText(String text, {bool allowErrors: false}) {
Uri testDartUri = Uri.parse(absUri('/test.dart'));
String resolveToAbsoluteUri(String relativeUri) =>
testDartUri.resolve(relativeUri).toString();
CompilationUnit unit = _parseText(text);
UnlinkedUnit definingUnit =
new UnlinkedUnit.fromBuffer(serializeAstUnlinked(unit).toBuffer());
UnlinkedUnit getPart(String relativeUri) {
String absoluteUri = resolveToAbsoluteUri(relativeUri);
UnlinkedUnit unit = uriToUnit[absoluteUri];
if (unit == null && !allowMissingFiles) {
fail('Prelinker unexpectedly requested unit for "$relativeUri"'
' (resolves to "$absoluteUri").');
}
return unit;
}
UnlinkedPublicNamespace getImport(String relativeUri) {
String absoluteUri = resolveToAbsoluteUri(relativeUri);
UnlinkedPublicNamespace namespace = sdkPublicNamespace[absoluteUri];
if (namespace == null) {
namespace = uriToUnit[absoluteUri]?.publicNamespace;
}
if (namespace == null && !allowMissingFiles) {
fail('Prelinker unexpectedly requested namespace for "$relativeUri"'
' (resolves to "$absoluteUri").'
' Namespaces available: ${uriToUnit.keys}');
}
return namespace;
}
linked = new LinkedLibrary.fromBuffer(
prelink(definingUnit, getPart, getImport).toBuffer());
validateLinkedLibrary(linked);
unlinkedUnits = <UnlinkedUnit>[definingUnit];
for (String relativeUri in definingUnit.publicNamespace.parts) {
UnlinkedUnit unit = uriToUnit[resolveToAbsoluteUri(relativeUri)];
if (unit == null) {
if (!allowMissingFiles) {
fail('Test referred to unknown unit $relativeUri');
}
} else {
unlinkedUnits.add(unit);
}
}
}
CompilationUnit _parseText(String text) {
CharSequenceReader reader = new CharSequenceReader(text);
Scanner scanner =
new Scanner(null, reader, AnalysisErrorListener.NULL_LISTENER);
Token token = scanner.tokenize();
Parser parser = new Parser(null, AnalysisErrorListener.NULL_LISTENER);
parser.parseGenericMethods = true;
return parser.parseCompilationUnit(token);
}
}