• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

dart-lang / linter / 6444183028

01 Sep 2023 04:26PM UTC coverage: 96.562% (+0.01%) from 96.551%
6444183028

push

github

web-flow
update labels (#4740)

9127 of 9452 relevant lines covered (96.56%)

1.48 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

42.86
/lib/src/analyzer.dart
1
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2
// for details. All rights reserved. Use of this source code is governed by a
3
// BSD-style license that can be found in the LICENSE file.
4

5
// ignore_for_file: implementation_imports
6

7
import 'dart:convert';
8
import 'dart:io';
9
import 'dart:math' as math;
10

11
import 'package:analyzer/error/error.dart';
12
import 'package:analyzer/src/generated/engine.dart' show AnalysisErrorInfo;
13
import 'package:analyzer/src/lint/io.dart' show errorSink;
14
import 'package:analyzer/src/lint/linter.dart';
15
import 'package:analyzer/src/lint/registry.dart';
16
import 'package:analyzer/src/lint/util.dart' as util;
17
import 'package:analyzer/src/services/lint.dart' as lint_service;
18
import 'package:pub_semver/pub_semver.dart';
19

20
export 'package:analyzer/dart/element/type_system.dart';
21
export 'package:analyzer/src/dart/ast/token.dart';
22
export 'package:analyzer/src/dart/element/inheritance_manager3.dart'
23
    show InheritanceManager3, Name;
24
export 'package:analyzer/src/dart/error/lint_codes.dart';
25
export 'package:analyzer/src/dart/resolver/exit_detector.dart';
26
export 'package:analyzer/src/generated/engine.dart' show AnalysisErrorInfo;
27
export 'package:analyzer/src/generated/source.dart' show LineInfo, Source;
28
export 'package:analyzer/src/lint/linter.dart'
29
    show
30
        dart3,
31
        DartLinter,
32
        Group,
33
        LintFilter,
34
        LintRule,
35
        LinterContext,
36
        LinterOptions,
37
        Maturity,
38
        NodeLintRegistry,
39
        NodeLintRule,
40
        State;
41
export 'package:analyzer/src/lint/pub.dart' show PSEntry, PubspecVisitor;
42
export 'package:analyzer/src/lint/util.dart' show FileSpelunker;
43
export 'package:analyzer/src/services/lint.dart' show lintRegistry;
44
export 'package:analyzer/src/workspace/pub.dart' show PubWorkspacePackage;
45

46
const loggedAnalyzerErrorExitCode = 63;
47

48
/// A version describing Dart language version 2.12.0.
49
// todo(pq): remove when analyzer 5.5.0 is published.
50
final Version dart2_12 = Version(2, 12, 0);
3✔
51

52
Future<Iterable<AnalysisErrorInfo>> lintFiles(
1✔
53
    DartLinter linter, List<File> filesToLint) async {
54
  // Setup an error watcher to track whether an error was logged to stderr so
55
  // we can set the exit code accordingly.
56
  var errorWatcher = ErrorWatchingSink(errorSink);
2✔
57
  errorSink = errorWatcher;
58

59
  var errors = await linter.lintFiles(filesToLint);
1✔
60
  if (errorWatcher.encounteredError) {
1✔
61
    exitCode = loggedAnalyzerErrorExitCode;
×
62
  } else if (errors.isNotEmpty) {
1✔
63
    exitCode = _maxSeverity(errors.toList(), linter.options.filter);
5✔
64
  }
65

66
  return errors;
67
}
68

69
Iterable<AnalysisError> _filtered(
1✔
70
        List<AnalysisError> errors, LintFilter? filter) =>
71
    (filter == null)
72
        ? errors
73
        : errors.where((AnalysisError e) => !filter.filter(e));
3✔
74

75
int _maxSeverity(List<AnalysisErrorInfo> errors, LintFilter? filter) {
1✔
76
  var max = 0;
77
  for (var info in errors) {
2✔
78
    _filtered(info.errors, filter).forEach((AnalysisError e) {
4✔
79
      max = math.max(max, e.errorCode.errorSeverity.ordinal);
4✔
80
    });
81
  }
82
  return max;
83
}
84

85
/// Facade for managing access to `analyzer` package APIs.
86
class Analyzer {
87
  /// Shared instance.
88
  static Analyzer facade = Analyzer();
3✔
89

90
  /// Returns currently registered lint rules.
91
  Iterable<LintRule> get registeredRules => Registry.ruleRegistry;
2✔
92

93
  /// Cache linter version; used in summary signatures.
94
  void cacheLinterVersion() {
1✔
95
    // todo(pq): remove (https://github.com/dart-lang/linter/issues/4418)
96
    lint_service.linterVersion = '1.35.0';
97
  }
98

99
  /// Create a library name prefix based on [libraryPath], [projectRoot] and
100
  /// current [packageName].
101
  String createLibraryNamePrefix(
1✔
102
          {required String libraryPath,
103
          String? projectRoot,
104
          String? packageName}) =>
105
      util.createLibraryNamePrefix(
1✔
106
          libraryPath: libraryPath,
107
          projectRoot: projectRoot,
108
          packageName: packageName);
109

110
  /// Register this [lint] with the analyzer's rule registry.
111
  void register(LintRule lint) {
1✔
112
    Registry.ruleRegistry.register(lint);
2✔
113
  }
114
}
115

116
class ErrorWatchingSink implements IOSink {
117
  bool encounteredError = false;
118

119
  IOSink delegate;
120

121
  ErrorWatchingSink(this.delegate);
1✔
122

123
  @override
×
124
  Future get done => delegate.done;
×
125

126
  @override
×
127
  Encoding get encoding => delegate.encoding;
×
128

129
  @override
×
130
  set encoding(Encoding encoding) {
131
    delegate.encoding = encoding;
×
132
  }
133

134
  @override
×
135
  void add(List<int> data) {
136
    delegate.add(data);
×
137
  }
138

139
  @override
×
140
  void addError(Object error, [StackTrace? stackTrace]) {
141
    encounteredError = true;
×
142
    delegate.addError(error, stackTrace);
×
143
  }
144

145
  @override
×
146
  Future addStream(Stream<List<int>> stream) => delegate.addStream(stream);
×
147

148
  @override
×
149
  Future close() => delegate.close();
×
150

151
  @override
×
152
  Future flush() => delegate.flush();
×
153

154
  @override
×
155
  void write(Object? obj) {
156
    delegate.write(obj);
×
157
  }
158

159
  @override
×
160
  void writeAll(Iterable objects, [String separator = '']) {
161
    delegate.writeAll(objects, separator);
×
162
  }
163

164
  @override
×
165
  void writeCharCode(int charCode) {
166
    delegate.writeCharCode(charCode);
×
167
  }
168

169
  @override
×
170
  void writeln([Object? obj = '']) {
171
    // 'Exception while using a Visitor to visit ...' (
172
    if (obj.toString().startsWith('Exception')) {
×
173
      encounteredError = true;
×
174
    }
175
    delegate.writeln(obj);
×
176
  }
177
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc