/* * Copyright 2017-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package com.facebook.buck.ide.intellij.model; import java.util.Optional; /** * List of module types that are recognized by the model. * * <p>The types in this enum are ordered by priority. When multiple targets apply the type on a * module only the type with the highest priority is used as the result type. * * <p>For example, if one target's rule sets the type to ANDROID_MODULE and another target's rule * sets it to JAVA_MODULE, the final module type would be ANDROID_MODULE. */ public enum IjModuleType { /** * Modules that contain IntelliJ plugins use this custom type to indicate that they should be run * in an environment with an IDEA installation. */ INTELLIJ_PLUGIN_MODULE("PLUGIN_MODULE") { @Override public Optional<String> getSdkName(IjProjectConfig projectConfig) { return projectConfig.getIntellijModuleSdkName(); } @Override public String getSdkType(IjProjectConfig projectConfig) { return SDK_TYPE_IDEA; } }, /** * Similar to {@link #ANDROID_MODULE} but can contain Android resources and thus cannot be * aggregated with a module located in the parent directory. */ ANDROID_RESOURCES_MODULE("JAVA_MODULE") { @Override public Optional<String> getSdkName(IjProjectConfig projectConfig) { return projectConfig.getAndroidModuleSdkName(); } @Override public String getSdkType(IjProjectConfig projectConfig) { return projectConfig.getAndroidModuleSdkType().orElse(SDK_TYPE_ANDROID); } @Override public boolean canBeAggregated() { return false; } }, /** * A module with code that does not contain Android resources. * * @see #ANDROID_RESOURCES_MODULE */ ANDROID_MODULE("JAVA_MODULE") { @Override public Optional<String> getSdkName(IjProjectConfig projectConfig) { return projectConfig.getAndroidModuleSdkName(); } @Override public String getSdkType(IjProjectConfig projectConfig) { return projectConfig.getAndroidModuleSdkType().orElse(SDK_TYPE_ANDROID); } }, JAVA_MODULE("JAVA_MODULE") { @Override public Optional<String> getSdkName(IjProjectConfig projectConfig) { return projectConfig.getJavaModuleSdkName(); } @Override public String getSdkType(IjProjectConfig projectConfig) { return projectConfig.getJavaModuleSdkType().orElse(SDK_TYPE_JAVA); } }, UNKNOWN_MODULE("JAVA_MODULE") { @Override public Optional<String> getSdkName(IjProjectConfig projectConfig) { return Optional.empty(); } @Override public String getSdkType(IjProjectConfig projectConfig) { return SDK_TYPE_JAVA; } }, ; // From constructor of com.intellij.openapi.projectRoots.impl.JavaSdkImpl private static final String SDK_TYPE_JAVA = "JavaSDK"; // From constructor of org.jetbrains.android.sdk.AndroidSdkType private static final String SDK_TYPE_ANDROID = "Android SDK"; // From constructor of org.jetbrains.idea.devkit.projectRoots.IdeaJdk private static final String SDK_TYPE_IDEA = "IDEA JDK"; IjModuleType(String imlModuleType) { this.imlModuleType = imlModuleType; } private final String imlModuleType; public abstract Optional<String> getSdkName(IjProjectConfig projectConfig); public abstract String getSdkType(IjProjectConfig projectConfig); public boolean canBeAggregated() { return true; } public String getImlModuleType() { return imlModuleType; } public boolean hasHigherPriorityThan(IjModuleType moduleType) { return this.compareTo(moduleType) < 0; } }