-
Notifications
You must be signed in to change notification settings - Fork 3.5k
[tool] Change gradle-check logic to enforce alignemnt of java versions and a minimum (17) #10206
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
[tool] Change gradle-check logic to enforce alignemnt of java versions and a minimum (17) #10206
Conversation
…va version alignment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request updates the Java compatibility version to 17 across multiple Android packages and enhances the gradle-check
tool to enforce this new minimum version and ensure version alignment within build.gradle
files. The changes also include numerous formatting updates in Dart files, likely from an auto-formatter.
My review focuses on the new validation logic in gradle-check
. While the new checks are a great improvement, I've identified a potential issue in how Java versions are parsed, which could lead to incorrect validation in some edge cases. I've provided a suggestion to make the parsing more robust.
final List<String> javaVersions = <String>[]; | ||
// Some java versions have the format VERSION_1_8 but we dont need to handle those | ||
// because they are below the minimum. | ||
final RegExp javaVersionMatcher = | ||
RegExp(r'JavaVersion.VERSION_(?<javaVersion>\d+)'); | ||
for (final String line in gradleLines) { | ||
final RegExpMatch? match = javaVersionMatcher.firstMatch(line); | ||
if (!_isCommented(line) && match != null) { | ||
final String? foundVersion = match.namedGroup('javaVersion'); | ||
if (foundVersion != null) { | ||
javaVersions.add(foundVersion); | ||
} | ||
} | ||
} | ||
if (javaVersions.isNotEmpty) { | ||
final int version = int.parse(javaVersions.first); | ||
if (version < minimumJavaVersion) { | ||
final String minimumJavaVersionError = ''' | ||
build.gradle(.kts) uses "JavaVersion.VERSION_$version". | ||
Which is below the minimum required. Use at least "JavaVersion.VERSION_$minimumJavaVersion". | ||
'''; | ||
printError( | ||
'$indentation${minimumJavaVersionError.split('\n').join('\n$indentation')}'); | ||
return false; | ||
} | ||
if (!javaVersions.every((String element) => element == '$version')) { | ||
const String javaVersionAlignmentError = ''' | ||
If build.gradle(.kts) uses JavaVersion.* versions must be the same. | ||
'''; | ||
printError( | ||
'$indentation${javaVersionAlignmentError.split('\n').join('\n$indentation')}'); | ||
return false; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The current logic for parsing Java versions from build.gradle
files might not correctly handle older version formats like JavaVersion.VERSION_1_8
. The regex RegExp(r'JavaVersion.VERSION_(?<javaVersion>\d+)')
only captures numeric versions, so it would miss versions with underscores. This could lead to incorrect validation if a file mixes old and new version formats.
I suggest a more robust parsing logic that can handle both formats (e.g., 11
and 1_8
) to ensure all specified Java versions are correctly identified and validated for alignment and minimum version requirements.
final List<int> javaVersions = <int>[];
// Some java versions have the format VERSION_1_8.
final RegExp javaVersionMatcher =
RegExp(r'JavaVersion.VERSION_(?<javaVersion>[\d_]+)');
for (final String line in gradleLines) {
final RegExpMatch? match = javaVersionMatcher.firstMatch(line);
if (!_isCommented(line) && match != null) {
final String? foundVersion = match.namedGroup('javaVersion');
if (foundVersion != null) {
javaVersions.add(int.parse(foundVersion.split('_').last));
}
}
}
if (javaVersions.isNotEmpty) {
final int version = javaVersions.first;
if (version < minimumJavaVersion) {
final String minimumJavaVersionError = '''
build.gradle(.kts) uses "JavaVersion.VERSION_$version".
Which is below the minimum required. Use at least "JavaVersion.VERSION_$minimumJavaVersion".
''';
printError(
'$indentation${minimumJavaVersionError.split('\n').join('\n$indentation')}');
return false;
}
if (!javaVersions.every((int element) => element == version)) {
const String javaVersionAlignmentError = '''
If build.gradle(.kts) uses JavaVersion.* versions must be the same.
''';
printError(
'$indentation${javaVersionAlignmentError.split('\n').join('\n$indentation')}');
return false;
}
}
Hold review/merge until #10201 has merged.
This pr is code review feedback from #10201 (comment)
Pre-Review Checklist
[shared_preferences]
pubspec.yaml
with an appropriate new version according to the [pub versioning philosophy], or I have commented below to indicate which [version change exemption] this PR falls under[^1].CHANGELOG.md
to add a description of the change, [following repository CHANGELOG style], or I have commented below to indicate which [CHANGELOG exemption] this PR falls under[^1].///
).