| /* |
| * Copyright 2016 The Bazel Authors. All rights reserved. |
| * |
| * 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.google.idea.blaze.android.cppimpl; |
| |
| import static com.jetbrains.cidr.lang.OCLanguage.LANGUAGE_SUPPORT_DISABLED; |
| |
| import com.android.tools.ndk.NdkHelper; |
| import com.google.idea.blaze.base.model.BlazeProjectData; |
| import com.google.idea.blaze.base.model.primitives.LanguageClass; |
| import com.google.idea.blaze.base.projectview.ProjectViewSet; |
| import com.google.idea.blaze.base.scope.BlazeContext; |
| import com.google.idea.blaze.base.settings.BlazeImportSettings; |
| import com.google.idea.blaze.base.sync.BlazeSyncParams.SyncMode; |
| import com.google.idea.blaze.base.sync.SyncListener; |
| import com.intellij.openapi.application.ApplicationManager; |
| import com.intellij.openapi.project.Project; |
| import com.jetbrains.cidr.lang.workspace.OCWorkspace; |
| import com.jetbrains.cidr.lang.workspace.OCWorkspaceManager; |
| |
| final class BlazeNdkSupportEnabler extends SyncListener.Adapter { |
| |
| @Override |
| public void onSyncComplete( |
| Project project, |
| BlazeContext context, |
| BlazeImportSettings importSettings, |
| ProjectViewSet projectViewSet, |
| BlazeProjectData blazeProjectData, |
| SyncMode syncMode, |
| SyncResult syncResult) { |
| boolean enabled = blazeProjectData.workspaceLanguageSettings.isLanguageActive(LanguageClass.C); |
| enableCSupportInIde(project, enabled); |
| } |
| |
| /** |
| * If {@code enabled} is true, this method will enable C support in the IDE if it is not already |
| * enabled. if {@code enabled} is false this method will clear out any currently stored |
| * information in the IDE about C and will disable C support in the IDE, unless support is already |
| * disabled. In either case, if the value of enabled matches what the IDE currently does, this |
| * method will do nothing. |
| * |
| * @param project the project to enable or disable c support in. |
| * @param enabled if true, turn on C support in the IDE. If false, turn off C support in the IDE. |
| */ |
| private static void enableCSupportInIde(Project project, boolean enabled) { |
| OCWorkspace workspace = OCWorkspaceManager.getWorkspace(project); |
| Boolean isCurrentlyEnabled = !LANGUAGE_SUPPORT_DISABLED.get(project, false); |
| if (isCurrentlyEnabled != enabled) { |
| NdkHelper.disableCppLanguageSupport(project, !enabled); |
| rebuildSymbols(project, workspace); |
| } |
| } |
| |
| private static void rebuildSymbols(Project project, OCWorkspace workspace) { |
| ApplicationManager.getApplication() |
| .runReadAction( |
| () -> { |
| if (project.isDisposed()) { |
| return; |
| } |
| // Notifying BuildSettingsChangeTracker in unitTestMode will leads to a dead lock. |
| // See b/23087433 for more information. |
| if (!ApplicationManager.getApplication().isUnitTestMode()) { |
| workspace |
| .getModificationTrackers() |
| .getBuildSettingsChangesTracker() |
| .incModificationCount(); |
| } |
| }); |
| } |
| } |