| """Convenience methods for plugin_api.""" |
| |
| # The current indirect ij_product mapping (eg. "intellij-latest") |
| INDIRECT_IJ_PRODUCTS = { |
| "intellij-latest": "intellij-2016.3.1", |
| "android-studio-latest": "android-studio-145.1617.8", |
| "android-studio-beta": "android-studio-2.3.0.4", |
| "clion-latest": "clion-162.1967.7", |
| } |
| |
| DIRECT_IJ_PRODUCTS = { |
| "intellij-2016.3.1": struct( |
| ide="intellij", |
| directory="intellij_ce_2016_3_1", |
| ), |
| "intellij-162.2032.8": struct( |
| ide="intellij", |
| directory="IC_162_2032_8", |
| ), |
| "android-studio-145.1617.8": struct( |
| ide="android-studio", |
| directory="AI_145_1617_8", |
| ), |
| "android-studio-2.3.0.3": struct( |
| ide="android-studio", |
| directory="android_studio_2_3_0_3", |
| ), |
| "android-studio-2.3.0.4": struct( |
| ide="android-studio", |
| directory="android_studio_2_3_0_4", |
| ), |
| "clion-162.1967.7": struct( |
| ide="clion", |
| directory="CL_162_1967_7", |
| ), |
| "clion-2016.3.2": struct( |
| ide="clion", |
| directory="clion_2016_3_2", |
| ), |
| } |
| |
| # BUILD_VARS for each IDE corresponding to indirect ij_products, eg. "intellij-latest" |
| |
| |
| |
| |
| |
| |
| def select_for_plugin_api(params): |
| """Selects for a plugin_api. |
| |
| Args: |
| params: A dict with ij_product -> value. |
| You may only include direct ij_products here, |
| not indirects (eg. intellij-latest). |
| Returns: |
| A select statement on all plugin_apis. Unless you include a "default", |
| a non-matched plugin_api will result in an error. |
| |
| Example: |
| java_library( |
| name = "foo", |
| srcs = select_for_plugin_api({ |
| "intellij-2016.3.1": [...my intellij 2016.3 sources ....], |
| "intellij-2012.2.4": [...my intellij 2016.2 sources ...], |
| }), |
| ) |
| """ |
| if not params: |
| fail("Empty select_for_plugin_api") |
| |
| for indirect_ij_product in INDIRECT_IJ_PRODUCTS: |
| if indirect_ij_product in params: |
| error_message = "".join([ |
| "Do not select on indirect ij_product %s. " % indirect_ij_product, |
| "Instead, select on an exact ij_product."]) |
| fail(error_message) |
| |
| expanded_params = dict(**params) |
| |
| # Expand all indirect plugin_apis to point to their |
| # corresponding direct plugin_api. |
| # |
| # {"intellij-2016.3.1": "foo"} -> |
| # {"intellij-2016.3.1": "foo", "intellij-latest": "foo"} |
| for indirect_ij_product, resolved_plugin_api in INDIRECT_IJ_PRODUCTS.items(): |
| if resolved_plugin_api in params: |
| expanded_params[indirect_ij_product] = params[resolved_plugin_api] |
| |
| # Map the shorthand ij_products to full config_setting targets. |
| # This makes it more convenient so the user doesn't have to |
| # fully specify the path to the plugin_apis |
| select_params = dict() |
| for ij_product, value in expanded_params.items(): |
| if ij_product == "default": |
| select_params["//conditions:default"] = value |
| else: |
| select_params["//intellij_platform_sdk:" + ij_product] = value |
| |
| return select(select_params) |
| |
| def select_for_ide(intellij=None, android_studio=None, clion=None, default=None): |
| """Selects for the supported IDEs. |
| |
| Args: |
| intellij: Files to use for IntelliJ. If None, will use default. |
| android_studio: Files to use for Android Studio. If None will use default. |
| clion: Files to use for CLion. If None will use default. |
| default: Files to use for any IDEs not passed. |
| Returns: |
| A select statement on all plugin_apis, sorted into IDEs. |
| |
| Example: |
| java_library( |
| name = "foo", |
| srcs = select_for_ide( |
| clion = [":cpp_only_sources"], |
| default = [":java_only_sources"], |
| ), |
| ) |
| """ |
| intellij = intellij or default |
| android_studio = android_studio or default |
| clion = clion or default |
| |
| ide_to_value = { |
| "intellij" : intellij, |
| "android-studio": android_studio, |
| "clion": clion, |
| } |
| |
| # Map (direct ij_product) -> corresponding ide value |
| params = dict() |
| for ij_product, value in DIRECT_IJ_PRODUCTS.items(): |
| params[ij_product] = ide_to_value[value.ide] |
| params["default"] = default |
| |
| return select_for_plugin_api(params) |
| |
| def _plugin_api_directory(value): |
| return "@" + value.directory + "//" |
| |
| def select_from_plugin_api_directory(intellij, android_studio, clion): |
| """Internal convenience method to generate select statement from the IDE's plugin_api directories.""" |
| |
| ide_to_value = { |
| "intellij" : intellij, |
| "android-studio": android_studio, |
| "clion": clion, |
| } |
| |
| # Map (direct ij_product) -> corresponding product directory |
| params = dict() |
| for ij_product, value in DIRECT_IJ_PRODUCTS.items(): |
| params[ij_product] = [_plugin_api_directory(value) + item for item in ide_to_value[value.ide]] |
| |
| # No ij_product == intellij-latest |
| params["default"] = params[INDIRECT_IJ_PRODUCTS["intellij-latest"]] |
| |
| return select_for_plugin_api(params) |