blob: bd9e3a27f00eaacf84100e69e523952cd92dc3a3 [file] [log] [blame]
// 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.src.summary.public_namespace_visitor;
import 'package:analyzer/analyzer.dart';
import 'package:analyzer/src/summary/base.dart';
import 'package:analyzer/src/summary/format.dart';
/**
* Compute the public namespace portion of the summary for the given [unit],
* which is presumed to be an unresolved AST.
*/
UnlinkedPublicNamespaceBuilder computePublicNamespace(
BuilderContext ctx, CompilationUnit unit) {
_PublicNamespaceVisitor visitor = new _PublicNamespaceVisitor(ctx);
unit.accept(visitor);
return encodeUnlinkedPublicNamespace(ctx,
names: visitor.names, exports: visitor.exports, parts: visitor.parts);
}
class _CombinatorEncoder extends SimpleAstVisitor<UnlinkedCombinatorBuilder> {
final BuilderContext ctx;
_CombinatorEncoder(this.ctx);
List<String> encodeNames(NodeList<SimpleIdentifier> names) =>
names.map((SimpleIdentifier id) => id.name).toList();
@override
UnlinkedCombinatorBuilder visitHideCombinator(HideCombinator node) {
return encodeUnlinkedCombinator(ctx, hides: encodeNames(node.hiddenNames));
}
@override
UnlinkedCombinatorBuilder visitShowCombinator(ShowCombinator node) {
return encodeUnlinkedCombinator(ctx, shows: encodeNames(node.shownNames));
}
}
class _PublicNamespaceVisitor extends RecursiveAstVisitor {
final BuilderContext ctx;
final List<UnlinkedPublicNameBuilder> names = <UnlinkedPublicNameBuilder>[];
final List<UnlinkedExportBuilder> exports = <UnlinkedExportBuilder>[];
final List<UnlinkedPartBuilder> parts = <UnlinkedPartBuilder>[];
_PublicNamespaceVisitor(this.ctx);
void addNameIfPublic(String name, PrelinkedReferenceKind kind) {
if (isPublic(name)) {
names.add(encodeUnlinkedPublicName(ctx, name: name, kind: kind));
}
}
bool isPublic(String name) => !name.startsWith('_');
@override
visitClassDeclaration(ClassDeclaration node) {
addNameIfPublic(node.name.name, PrelinkedReferenceKind.classOrEnum);
}
@override
visitClassTypeAlias(ClassTypeAlias node) {
addNameIfPublic(node.name.name, PrelinkedReferenceKind.classOrEnum);
}
@override
visitEnumDeclaration(EnumDeclaration node) {
addNameIfPublic(node.name.name, PrelinkedReferenceKind.classOrEnum);
}
@override
visitExportDirective(ExportDirective node) {
exports.add(encodeUnlinkedExport(ctx,
uri: node.uri.stringValue,
combinators: node.combinators
.map((Combinator c) => c.accept(new _CombinatorEncoder(ctx)))
.toList()));
}
@override
visitFunctionDeclaration(FunctionDeclaration node) {
String name = node.name.name;
if (node.isSetter) {
name += '=';
}
addNameIfPublic(name, PrelinkedReferenceKind.other);
}
@override
visitFunctionTypeAlias(FunctionTypeAlias node) {
addNameIfPublic(node.name.name, PrelinkedReferenceKind.typedef);
}
@override
visitPartDirective(PartDirective node) {
parts.add(encodeUnlinkedPart(ctx, uri: node.uri.stringValue));
}
@override
visitVariableDeclaration(VariableDeclaration node) {
String name = node.name.name;
addNameIfPublic(name, PrelinkedReferenceKind.other);
if (!node.isFinal && !node.isConst) {
addNameIfPublic('$name=', PrelinkedReferenceKind.other);
}
}
}