Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
ignore some entity by exclude_entity
  • Loading branch information
iimironchuk committed Apr 29, 2025
commit 969bfc3d188c77d65429ddb38f671878a49326a1
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,24 @@ class PreferMatchFileNameParameters {
/// A variable that indicates whether to ignore extensions
final bool ignoreExtensions;

/// A list of methods that should be excluded from the lint.
final Iterable<String> excludeEntity;

static const bool _defaultIgnoreExtensionsValue = false;

/// Constructor for [PreferMatchFileNameParameters] model
const PreferMatchFileNameParameters({
required this.ignoreExtensions,
required this.excludeEntity,
});

/// Method for creating from json data
factory PreferMatchFileNameParameters.fromJson(Map<String, Object?> json) =>
PreferMatchFileNameParameters(
ignoreExtensions:
json['ignore_extensions'] as bool? ?? _defaultIgnoreExtensionsValue,
excludeEntity: (json['exclude_entity'] as Iterable?)
?.map((e) => e.toString())
.toList() ?? [],
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import 'package:solid_lints/src/models/rule_config.dart';
import 'package:solid_lints/src/models/solid_lint_rule.dart';
import 'package:solid_lints/src/utils/node_utils.dart';

import '../number_of_parameters/models/number_of_parameters_parameters.dart';

/// Warns about a mismatch between file name and first declared element inside.
///
/// This improves navigation by matching file content and file name.
Expand Down Expand Up @@ -82,8 +80,12 @@ class PreferMatchFileNameRule
) {
context.registry.addCompilationUnit((node) {
final isIgnored = config.parameters.ignoreExtensions;
final excludedEntities = config.parameters.excludeEntity;

final visitor = PreferMatchFileNameVisitor(ignoreExtensions: isIgnored);
final visitor = PreferMatchFileNameVisitor(
ignoreExtensions: isIgnored,
excludedEntities: excludedEntities,
);

node.accept(visitor);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:solid_lints/src/common/parameters/excluded_identifiers_list_parameter.dart';
import 'package:solid_lints/src/lints/prefer_match_file_name/models/declaration_token_info.dart';

/// The AST visitor that will collect all Class, Enum, Extension and Mixin
Expand All @@ -10,69 +11,97 @@ class PreferMatchFileNameVisitor extends RecursiveAstVisitor<void> {
/// Variable for making sure if extensions should be ignored
final bool ignoreExtensions;

/// Iterable that contains the name of entity (or entities) that should
/// be ignored
final Iterable<String> excludedEntities;

/// Constructor of [PreferMatchFileNameVisitor] class
PreferMatchFileNameVisitor({
required this.ignoreExtensions,
required this.excludedEntities,
});

/// List of all declarations
Iterable<DeclarationTokenInfo> get declarations => _declarations
..sort(
// partition into public and private
// put public ones first
// each partition sorted by declaration order
(a, b) => _publicDeclarationsFirst(a, b) ?? _byDeclarationOrder(a, b),
);

@override
void visitClassDeclaration(ClassDeclaration node) {
super.visitClassDeclaration(node);

_declarations.add((token: node.name, parent: node));
}
Iterable<DeclarationTokenInfo> get declarations =>
_declarations
..sort(
// partition into public and private
// put public ones first
// each partition sorted by declaration order
(a, b) =>
_publicDeclarationsFirst(a, b) ?? _byDeclarationOrder(a, b),
);

@override
void visitExtensionDeclaration(ExtensionDeclaration node) {
super.visitExtensionDeclaration(node);
bool _shouldIgnore(Declaration node) {
if(excludedEntities.isEmpty) return false;

if (!ignoreExtensions) {
final name = node.name;
if (name != null) {
_declarations.add((token: name, parent: node));
}
if (node is ClassDeclaration && excludedEntities.contains('class')) {
return true;
} else if (node is MixinDeclaration && excludedEntities.contains('mixin')) {
return true;
} else if (node is EnumDeclaration && excludedEntities.contains('enum')) {
return true;
} else if (node is ExtensionDeclaration &&
excludedEntities.contains('extension')) {
return true;
}

return false;
}

@override
void visitMixinDeclaration(MixinDeclaration node) {
super.visitMixinDeclaration(node);

_declarations.add((token: node.name, parent: node));
}
@override
void visitClassDeclaration(ClassDeclaration node) {
super.visitClassDeclaration(node);

@override
void visitEnumDeclaration(EnumDeclaration node) {
super.visitEnumDeclaration(node);
if(_shouldIgnore(node)) return;

_declarations.add((token: node.name, parent: node));
}
_declarations.add((token: node.name, parent: node));
}

int? _publicDeclarationsFirst(
DeclarationTokenInfo a,
DeclarationTokenInfo b,
) {
final isAPrivate = Identifier.isPrivateName(a.token.lexeme);
final isBPrivate = Identifier.isPrivateName(b.token.lexeme);
if (!isAPrivate && isBPrivate) {
return -1;
} else if (isAPrivate && !isBPrivate) {
return 1;
}
// no reorder needed;
return null;
@override
void visitExtensionDeclaration(ExtensionDeclaration node) {
super.visitExtensionDeclaration(node);

if (_shouldIgnore(node)) return;

final name = node.name;
if (name != null) {
_declarations.add((token: name, parent: node));
}
}

int _byDeclarationOrder(DeclarationTokenInfo a, DeclarationTokenInfo b) {
return a.token.offset.compareTo(b.token.offset);
@override
void visitMixinDeclaration(MixinDeclaration node) {
super.visitMixinDeclaration(node);

if(_shouldIgnore(node)) return;

_declarations.add((token: node.name, parent: node));
}

@override
void visitEnumDeclaration(EnumDeclaration node) {
super.visitEnumDeclaration(node);

if(_shouldIgnore(node)) return;

_declarations.add((token: node.name, parent: node));
}

int? _publicDeclarationsFirst(DeclarationTokenInfo a,
DeclarationTokenInfo b,) {
final isAPrivate = Identifier.isPrivateName(a.token.lexeme);
final isBPrivate = Identifier.isPrivateName(b.token.lexeme);
if (!isAPrivate && isBPrivate) {
return -1;
} else if (isAPrivate && !isBPrivate) {
return 1;
}
// no reorder needed;
return null;
}

int _byDeclarationOrder(DeclarationTokenInfo a, DeclarationTokenInfo b) {
return a.token.offset.compareTo(b.token.offset);
}}