1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2023 The Android Open Source Project 2*7594170eSAndroid Build Coastguard Worker# 3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*7594170eSAndroid Build Coastguard Worker# 7*7594170eSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*7594170eSAndroid Build Coastguard Worker# 9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*7594170eSAndroid Build Coastguard Worker# limitations under the License. 14*7594170eSAndroid Build Coastguard Worker"""Constants and utility functions relating to Java versions and how they map to SDK versions. 15*7594170eSAndroid Build Coastguard Worker""" 16*7594170eSAndroid Build Coastguard Worker 17*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/common:api.bzl", "api") 18*7594170eSAndroid Build Coastguard Worker 19*7594170eSAndroid Build Coastguard Worker# The default java version used absent any java_version or sdk_version specification. 20*7594170eSAndroid Build Coastguard Worker_DEFAULT_VERSION = 17 21*7594170eSAndroid Build Coastguard Worker 22*7594170eSAndroid Build Coastguard Worker# All available java versions 23*7594170eSAndroid Build Coastguard Worker_ALL_VERSIONS = [ 24*7594170eSAndroid Build Coastguard Worker 7, 25*7594170eSAndroid Build Coastguard Worker 8, 26*7594170eSAndroid Build Coastguard Worker 9, 27*7594170eSAndroid Build Coastguard Worker 11, 28*7594170eSAndroid Build Coastguard Worker 17, 29*7594170eSAndroid Build Coastguard Worker] 30*7594170eSAndroid Build Coastguard Worker 31*7594170eSAndroid Build Coastguard Worker_VERSION_TO_CONFIG_SETTING = { 32*7594170eSAndroid Build Coastguard Worker java_version: "config_setting_java_%s" % java_version 33*7594170eSAndroid Build Coastguard Worker for java_version in _ALL_VERSIONS 34*7594170eSAndroid Build Coastguard Worker} 35*7594170eSAndroid Build Coastguard Worker 36*7594170eSAndroid Build Coastguard Workerdef _compatible_versions_for_api_level(api_level): 37*7594170eSAndroid Build Coastguard Worker """Returns all possible java versions that can be used at the given api level.""" 38*7594170eSAndroid Build Coastguard Worker if api_level in (api.FUTURE_API_LEVEL, api.NONE_API_LEVEL): 39*7594170eSAndroid Build Coastguard Worker return _ALL_VERSIONS 40*7594170eSAndroid Build Coastguard Worker if api_level <= 23: 41*7594170eSAndroid Build Coastguard Worker return [7] 42*7594170eSAndroid Build Coastguard Worker if api_level <= 29: 43*7594170eSAndroid Build Coastguard Worker return [ 44*7594170eSAndroid Build Coastguard Worker 7, 45*7594170eSAndroid Build Coastguard Worker 8, 46*7594170eSAndroid Build Coastguard Worker ] 47*7594170eSAndroid Build Coastguard Worker if api_level <= 31: 48*7594170eSAndroid Build Coastguard Worker return [ 49*7594170eSAndroid Build Coastguard Worker 7, 50*7594170eSAndroid Build Coastguard Worker 8, 51*7594170eSAndroid Build Coastguard Worker 9, 52*7594170eSAndroid Build Coastguard Worker ] 53*7594170eSAndroid Build Coastguard Worker if api_level <= 33: 54*7594170eSAndroid Build Coastguard Worker return [ 55*7594170eSAndroid Build Coastguard Worker 7, 56*7594170eSAndroid Build Coastguard Worker 8, 57*7594170eSAndroid Build Coastguard Worker 9, 58*7594170eSAndroid Build Coastguard Worker 11, 59*7594170eSAndroid Build Coastguard Worker ] 60*7594170eSAndroid Build Coastguard Worker return _ALL_VERSIONS 61*7594170eSAndroid Build Coastguard Worker 62*7594170eSAndroid Build Coastguard Workerdef _supports_pre_java_9(api_level): 63*7594170eSAndroid Build Coastguard Worker return any([ 64*7594170eSAndroid Build Coastguard Worker version < 9 65*7594170eSAndroid Build Coastguard Worker for version in _compatible_versions_for_api_level(api_level) 66*7594170eSAndroid Build Coastguard Worker ]) 67*7594170eSAndroid Build Coastguard Worker 68*7594170eSAndroid Build Coastguard Workerdef _supports_post_java_9(api_level): 69*7594170eSAndroid Build Coastguard Worker return any([ 70*7594170eSAndroid Build Coastguard Worker version >= 9 71*7594170eSAndroid Build Coastguard Worker for version in _compatible_versions_for_api_level(api_level) 72*7594170eSAndroid Build Coastguard Worker ]) 73*7594170eSAndroid Build Coastguard Worker 74*7594170eSAndroid Build Coastguard Worker_NORMALIZED_VERSIONS = { 75*7594170eSAndroid Build Coastguard Worker "1.7": 7, 76*7594170eSAndroid Build Coastguard Worker "7": 7, 77*7594170eSAndroid Build Coastguard Worker "1.8": 8, 78*7594170eSAndroid Build Coastguard Worker "8": 8, 79*7594170eSAndroid Build Coastguard Worker "1.9": 9, 80*7594170eSAndroid Build Coastguard Worker "9": 9, 81*7594170eSAndroid Build Coastguard Worker "11": 11, 82*7594170eSAndroid Build Coastguard Worker "17": 17, 83*7594170eSAndroid Build Coastguard Worker} 84*7594170eSAndroid Build Coastguard Worker 85*7594170eSAndroid Build Coastguard Workerdef _default_version(api_level): 86*7594170eSAndroid Build Coastguard Worker """Returns the default java version for the input api level.""" 87*7594170eSAndroid Build Coastguard Worker return max(_compatible_versions_for_api_level(api_level)) 88*7594170eSAndroid Build Coastguard Worker 89*7594170eSAndroid Build Coastguard Workerdef _get_version(java_version = None, api_level = None): 90*7594170eSAndroid Build Coastguard Worker """Returns the java version to use for a given target based on the java_version set by this target and the api_level_string extracted from sdk_version.""" 91*7594170eSAndroid Build Coastguard Worker if java_version: 92*7594170eSAndroid Build Coastguard Worker return _NORMALIZED_VERSIONS[java_version] 93*7594170eSAndroid Build Coastguard Worker elif api_level: 94*7594170eSAndroid Build Coastguard Worker return _default_version(api_level) 95*7594170eSAndroid Build Coastguard Worker return _DEFAULT_VERSION 96*7594170eSAndroid Build Coastguard Worker 97*7594170eSAndroid Build Coastguard Workerdef _kt_jvm_version_from_normalized_java_version(java_version): 98*7594170eSAndroid Build Coastguard Worker if java_version == 7: 99*7594170eSAndroid Build Coastguard Worker return "1.6" 100*7594170eSAndroid Build Coastguard Worker elif java_version == 8: 101*7594170eSAndroid Build Coastguard Worker return "1.8" 102*7594170eSAndroid Build Coastguard Worker else: 103*7594170eSAndroid Build Coastguard Worker return str(java_version) 104*7594170eSAndroid Build Coastguard Worker 105*7594170eSAndroid Build Coastguard Workerjava_versions = struct( 106*7594170eSAndroid Build Coastguard Worker ALL_VERSIONS = _ALL_VERSIONS, 107*7594170eSAndroid Build Coastguard Worker VERSION_TO_CONFIG_SETTING = _VERSION_TO_CONFIG_SETTING, 108*7594170eSAndroid Build Coastguard Worker compatible_versions_for_api_level = _compatible_versions_for_api_level, 109*7594170eSAndroid Build Coastguard Worker get_version = _get_version, 110*7594170eSAndroid Build Coastguard Worker kt_jvm_version_from_normalized_java_version = _kt_jvm_version_from_normalized_java_version, 111*7594170eSAndroid Build Coastguard Worker supports_pre_java_9 = _supports_pre_java_9, 112*7594170eSAndroid Build Coastguard Worker supports_post_java_9 = _supports_post_java_9, 113*7594170eSAndroid Build Coastguard Worker) 114