/*
 * 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.base.sync;

import com.google.common.collect.ImmutableMap;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.SourceFolder;
import com.intellij.openapi.vfs.VirtualFile;

/** An implementation of {@link SourceFolderProvider} with no language-specific settings. */
public class GenericSourceFolderProvider implements SourceFolderProvider {

  public static final GenericSourceFolderProvider INSTANCE = new GenericSourceFolderProvider();

  private GenericSourceFolderProvider() {}

  @Override
  public ImmutableMap<VirtualFile, SourceFolder> initializeSourceFolders(
      ContentEntry contentEntry) {
    ImmutableMap.Builder<VirtualFile, SourceFolder> output = ImmutableMap.builder();
    VirtualFile file = contentEntry.getFile();
    if (file != null) {
      output.put(file, contentEntry.addSourceFolder(file, false));
    }
    return output.build();
  }

  @Override
  public SourceFolder setSourceFolderForLocation(
      ContentEntry contentEntry,
      SourceFolder parentFolder,
      VirtualFile file,
      boolean isTestSource) {
    return contentEntry.addSourceFolder(file, isTestSource);
  }
}
