Skip to content

Commit

Permalink
Add package deprecation mechanism (#2761)
Browse files Browse the repository at this point in the history
  • Loading branch information
parlough committed Dec 19, 2023
1 parent 443d304 commit ed1c9d1
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 21 deletions.
55 changes: 34 additions & 21 deletions pkgs/dart_services/lib/src/analysis.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'dart:async';
import 'dart:io';

import 'package:analysis_server_lib/analysis_server_lib.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as path;

Expand Down Expand Up @@ -310,37 +311,35 @@ class AnalysisServerWrapper {
final imports = getAllImportsFor(source);
final importIssues = <api.AnalysisIssue>[];

late final lines = Lines(source);

for (final import in imports) {
final start = import.firstTokenAfterCommentAndMetadata;
final end = import.endToken;

// Ignore `dart:` core library imports.
if (import.dartImport) {
// ignore dart: imports.
} else if (import.packageImport) {
if (!isSupportedPackage(import.packageName)) {
continue;
}

if (import.packageImport) {
final packageName = import.packageName;
if (!isSupportedPackage(packageName)) {
importIssues.add(api.AnalysisIssue(
kind: 'warning',
message: "Unsupported package: 'package:${import.packageName}'.",
location: api.Location(
charStart: start.charOffset,
charLength: end.charEnd - start.charOffset,
line: lines.lineForOffset(start.charOffset),
column: lines.columnForOffset(start.charOffset),
),
message: "Unsupported package: 'package:$packageName'.",
location: import.getLocation(source),
));
} else if (isDeprecatedPackage(packageName)) {
importIssues.add(api.AnalysisIssue(
kind: 'warning',
message: "Deprecated package: 'package:$packageName'.",
correction: 'Try removing the import and usages of the package.',
url: 'https://github.com/dart-lang/dart-pad/wiki/'
'Package-and-plugin-support#deprecated-packages',
location: import.getLocation(source),
));
}
} else {
importIssues.add(api.AnalysisIssue(
kind: 'error',
message: 'Import type not supported.',
location: api.Location(
charStart: start.charOffset,
charLength: end.charEnd - start.charOffset,
line: lines.lineForOffset(start.charOffset),
column: lines.columnForOffset(start.charOffset),
),
location: import.getLocation(source),
));
}
}
Expand Down Expand Up @@ -460,3 +459,17 @@ extension SourceChangeExtension on SourceChange {
);
}
}

extension AnnotatedNodeExtension on AnnotatedNode {
api.Location getLocation(String source) {
final lines = Lines(source);
final start = firstTokenAfterCommentAndMetadata;

return api.Location(
charStart: start.charOffset,
charLength: endToken.charEnd - start.charOffset,
line: lines.lineForOffset(start.charOffset),
column: lines.columnForOffset(start.charOffset),
);
}
}
10 changes: 10 additions & 0 deletions pkgs/dart_services/lib/src/project_templates.dart
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,11 @@ const Set<String> supportedBasicDartPackages = {
'yaml_edit',
};

/// The set of all packages whose support in DartPad is deprecated.
const Set<String> _deprecatedPackages = {
'tuple',
};

/// A set of all allowed `dart:` imports. Currently includes non-VM libraries
/// listed as the [doc](https://api.dart.dev/stable/index.html) categories.
const Set<String> _allowedDartImports = {
Expand Down Expand Up @@ -264,3 +269,8 @@ bool isUnsupportedImport(
bool isSupportedPackage(String package) =>
_packagesIndicatingFlutter.contains(package) ||
supportedBasicDartPackages.contains(package);

/// If the specified [package] is deprecated in DartPad and
/// slated to be removed in a future update.
bool isDeprecatedPackage(String package) =>
_deprecatedPackages.contains(package);

0 comments on commit ed1c9d1

Please sign in to comment.