[gradle] IJ-CR-3154 fix code duplicate
[idea/community.git] / platform / projectModel-api / src / com / intellij / openapi / roots / OrderRootType.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.openapi.roots;
3
4 import com.intellij.openapi.extensions.ExtensionPointName;
5 import org.jetbrains.annotations.NotNull;
6
7 import java.util.ArrayList;
8 import java.util.Collections;
9 import java.util.List;
10
11 /**
12  * Root types that can be queried from OrderEntry.
13  *
14  * @author dsl
15  * @see OrderEntry
16  */
17 public class OrderRootType {
18   private final String myName;
19   private static boolean ourExtensionsLoaded;
20
21   public static final ExtensionPointName<OrderRootType> EP_NAME = ExtensionPointName.create("com.intellij.orderRootType");
22
23   static PersistentOrderRootType @NotNull [] ourPersistentOrderRootTypes = new PersistentOrderRootType[0];
24
25   protected OrderRootType(@NotNull String name) {
26     myName = name;
27   }
28
29   /**
30    * Classpath without output directories for modules. Includes:
31    * <ul>
32    * <li>classes roots for libraries and jdk</li>
33    * <li>recursively for module dependencies: only exported items</li>
34    * </ul>
35    */
36   public static final OrderRootType CLASSES = new PersistentOrderRootType("CLASSES", "classPath", null, "classPathEntry");
37
38   /**
39    * Sources. Includes:
40    * <ul>
41    * <li>production and test source roots for modules</li>
42    * <li>source roots for libraries and jdk</li>
43    * <li>recursively for module dependencies: only exported items</li>
44    * </ul>
45    */
46   public static final OrderRootType SOURCES = new PersistentOrderRootType("SOURCES", "sourcePath", null, "sourcePathEntry");
47
48   /**
49    * Generic documentation order root type
50    */
51   public static final OrderRootType DOCUMENTATION = new DocumentationRootType();
52
53   /**
54    * A temporary solution to exclude DOCUMENTATION from getAllTypes() and handle it only in special
55    * cases if supported by LibraryType.
56    */
57   public static class DocumentationRootType extends OrderRootType {
58     public DocumentationRootType() {
59       super("DOCUMENTATION");
60     }
61
62     @Override
63     public boolean skipWriteIfEmpty() {
64       return true;
65     }
66   }
67
68   @NotNull
69   public String name() {
70     return myName;
71   }
72
73   /**
74    * Whether this root type should be skipped when writing a Library if the root type doesn't contain
75    * any roots.
76    *
77    * @return true if empty root type should be skipped, false otherwise.
78    */
79   public boolean skipWriteIfEmpty() {
80     return false;
81   }
82
83   public static synchronized OrderRootType @NotNull [] getAllTypes() {
84     return getAllPersistentTypes();
85   }
86
87   public static PersistentOrderRootType @NotNull [] getAllPersistentTypes() {
88     if (!ourExtensionsLoaded) {
89       ourExtensionsLoaded = true;
90       EP_NAME.getExtensionList();
91     }
92     return ourPersistentOrderRootTypes;
93   }
94
95   @NotNull
96   public static List<PersistentOrderRootType> getSortedRootTypes() {
97     List<PersistentOrderRootType> allTypes = new ArrayList<>();
98     Collections.addAll(allTypes, getAllPersistentTypes());
99     allTypes.sort((o1, o2) -> o1.name().compareToIgnoreCase(o2.name()));
100     return allTypes;
101   }
102
103   @NotNull
104   protected static <T> T getOrderRootType(@NotNull Class<? extends T> orderRootTypeClass) {
105     List<OrderRootType> rootTypes = EP_NAME.getExtensionList();
106     for (OrderRootType rootType : rootTypes) {
107       if (orderRootTypeClass.isInstance(rootType)) {
108         @SuppressWarnings("unchecked") T t = (T)rootType;
109         return t;
110       }
111     }
112     assert false : "Root type " + orderRootTypeClass + " not found. All roots: " + rootTypes;
113     return null;
114   }
115
116   @Override
117   public final int hashCode() {
118     return super.hashCode();
119   }
120
121   @Override
122   public final boolean equals(Object obj) {
123     return super.equals(obj);
124   }
125
126   @Override
127   public String toString() {
128     return "Root " + name();
129   }
130 }