blob: 5b22d5bc5b5637f74de8be1b081e803b16100af8 [file]
// Copyright (c) 2017, 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.
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
/// Compute the [DefinedNames] for the given [unit].
DefinedNames computeDefinedNames(CompilationUnitImpl unit) {
DefinedNames names = DefinedNames();
void appendName(Set<String> names, Token? token) {
var lexeme = token?.lexeme;
if (lexeme != null && lexeme.isNotEmpty) {
names.add(lexeme);
}
}
void appendClassMemberName(ClassMemberImpl member) {
if (member is MethodDeclarationImpl) {
appendName(names.classMemberNames, member.name);
} else if (member is FieldDeclarationImpl) {
for (var field in member.fields.variables) {
appendName(names.classMemberNames, field.name);
}
}
}
void appendDeclaringFormalParameterNames(
PrimaryConstructorDeclarationImpl constructor, {
bool isExtensionType = false,
}) {
var parameters = constructor.formalParameters.allFormalParameters;
for (var i = 0; i < parameters.length; i++) {
var parameter = parameters[i];
var isRepresentation =
isExtensionType && i == 0 && parameter is RegularFormalParameterImpl;
if (parameter.finalOrVarKeyword != null || isRepresentation) {
appendName(names.classMemberNames, parameter.name);
}
}
}
void appendTopLevelName(CompilationUnitMemberImpl member) {
switch (member) {
case ClassDeclarationImpl():
appendName(names.topLevelNames, member.namePart.typeName);
if (member.namePart
case PrimaryConstructorDeclarationImpl constructor) {
appendDeclaringFormalParameterNames(constructor);
}
member.body.members.forEach(appendClassMemberName);
case EnumDeclarationImpl():
appendName(names.topLevelNames, member.namePart.typeName);
if (member.namePart
case PrimaryConstructorDeclarationImpl constructor) {
appendDeclaringFormalParameterNames(constructor);
}
for (var constant in member.body.constants) {
appendName(names.classMemberNames, constant.name);
}
member.body.members.forEach(appendClassMemberName);
case ExtensionDeclarationImpl():
appendName(names.topLevelNames, member.name);
member.body.members.forEach(appendClassMemberName);
case ExtensionTypeDeclarationImpl():
appendName(names.topLevelNames, member.namePart.typeName);
if (member.namePart
case PrimaryConstructorDeclarationImpl primaryConstructor) {
appendDeclaringFormalParameterNames(
primaryConstructor,
isExtensionType: true,
);
}
member.body.members.forEach(appendClassMemberName);
case FunctionDeclarationImpl():
appendName(names.topLevelNames, member.name);
case MixinDeclarationImpl():
appendName(names.topLevelNames, member.name);
member.body.members.forEach(appendClassMemberName);
case TopLevelVariableDeclarationImpl():
for (var variable in member.variables.variables) {
appendName(names.topLevelNames, variable.name);
}
case TypeAliasImpl():
appendName(names.topLevelNames, member.name);
}
}
unit.declarations.forEach(appendTopLevelName);
return names;
}
/// Defined top-level and class member names.
class DefinedNames {
final Set<String> topLevelNames = <String>{};
final Set<String> classMemberNames = <String>{};
}