package jetbrains.mps.vcs.platform.util; /*Generated by MPS */ import org.jetbrains.mps.openapi.model.EditableSModel; import com.intellij.openapi.project.Project; import jetbrains.mps.internal.collections.runtime.ListSequence; import org.jetbrains.annotations.NotNull; import java.util.List; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SModel; import java.util.ArrayList; import org.jetbrains.mps.openapi.persistence.DataSource; import jetbrains.mps.vfs.IFile; import jetbrains.mps.internal.collections.runtime.Sequence; import java.util.Collections; import jetbrains.mps.extapi.persistence.FileDataSource; import jetbrains.mps.persistence.FilePerRootDataSource; import jetbrains.mps.internal.collections.runtime.ISelector; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.smodel.Generator; import jetbrains.mps.project.AbstractModule; import jetbrains.mps.ide.vfs.VirtualFileUtils; import com.intellij.openapi.vcs.FileStatus; import com.intellij.openapi.vcs.FileStatusManager; import jetbrains.mps.internal.collections.runtime.IWhereFilter; public class ConflictsUtil { public ConflictsUtil() { } public static boolean isModelOrModuleConflicting(EditableSModel emd, Project project) { return ListSequence.fromList(getConflictingModelFiles(emd, project)).isNotEmpty() || ListSequence.fromList(getConflictingModuleFiles((emd != null ? emd.getModule() : null), project)).isNotEmpty(); } @NotNull public static List<VirtualFile> getConflictingModelFiles(@Nullable SModel model, @NotNull Project project) { if (!(model instanceof EditableSModel)) { return ListSequence.fromList(new ArrayList<VirtualFile>()); } DataSource ds = model.getSource(); Iterable<IFile> filesToCheck = Sequence.fromIterable(Collections.<IFile>emptyList()); if (ds instanceof FileDataSource) { filesToCheck = Sequence.<IFile>singleton(((FileDataSource) ds).getFile()); } else if (ds instanceof FilePerRootDataSource) { final FilePerRootDataSource ds1 = (FilePerRootDataSource) ds; filesToCheck = Sequence.fromIterable(((Iterable<String>) ds1.getAvailableStreams())).select(new ISelector<String, IFile>() { public IFile select(String it) { return ds1.getFile(it); } }); } return getConflictingFiles(filesToCheck, project); } @NotNull public static List<VirtualFile> getConflictingModuleFiles(@Nullable SModule module, @NotNull Project project) { List<IFile> filesToCheck = ListSequence.fromList(new ArrayList<IFile>()); if (module instanceof Generator) { module = ((Generator) module).getSourceLanguage(); } if (module instanceof AbstractModule) { AbstractModule amodule = (AbstractModule) module; if (amodule.getDescriptorFile() != null) { ListSequence.fromList(filesToCheck).addElement(amodule.getDescriptorFile()); } } return getConflictingFiles(filesToCheck, project); } private static boolean isConflictedFile(@NotNull IFile file, @NotNull Project project) { VirtualFile vf = VirtualFileUtils.getProjectVirtualFile(file); if (vf == null) { return false; } FileStatus status = FileStatusManager.getInstance(project).getStatus(vf); return FileStatus.MERGED_WITH_CONFLICTS == status || FileStatus.MERGED_WITH_BOTH_CONFLICTS == status; } private static List<VirtualFile> getConflictingFiles(Iterable<IFile> files, final Project project) { return Sequence.fromIterable(files).where(new IWhereFilter<IFile>() { public boolean accept(IFile f) { return isConflictedFile(f, project); } }).select(new ISelector<IFile, VirtualFile>() { public VirtualFile select(IFile f) { return VirtualFileUtils.getProjectVirtualFile(f); } }).toListSequence(); } }