[workspace model] provide implementation of FacetManager which stores data in workspa...
[idea/community.git] / platform / workspaceModel-core / src / ImlModelEntities.kt
1 package com.intellij.workspace.api
2
3 /**
4  * A prototype of implementation of the current (legacy) project model via [TypedEntity]. It uses similar concepts to simplify implementation
5  * of the bridge to the current model. Some peculiarities are fixed though:
6  * * source roots are moved of from content entries, content roots are stored separately in a module;
7  * * module libraries are stored in a real library table, unnamed libraries aren't allowed;
8  * * 'jar directory' flag is stored in a library root itself;
9  * * SDKs are represented as [LibraryEntity] with additional properties specified in [SdkEntity] attached to it.
10  */
11
12 interface ModuleEntity : TypedEntityWithPersistentId, ReferableTypedEntity {
13   val name: String
14   val dependencies: List<ModuleDependencyItem>
15
16   @JvmDefault
17   override fun persistentId(): ModuleId = ModuleId(name)
18
19   @JvmDefault val sourceRoots: Sequence<SourceRootEntity>
20     get() = referrers(SourceRootEntity::module)
21   @JvmDefault val contentRoots: Sequence<ContentRootEntity>
22     get() = referrers(ContentRootEntity::module)
23   @JvmDefault val customImlData: ModuleCustomImlDataEntity?
24     get() = referrers(ModuleCustomImlDataEntity::module).firstOrNull()
25
26   @JvmDefault val groupPath: ModuleGroupPathEntity?
27     get() = referrers(ModuleGroupPathEntity::module).firstOrNull()
28
29   @JvmDefault val javaSettings: JavaModuleSettingsEntity?
30     get() = referrers(JavaModuleSettingsEntity::module).firstOrNull()
31 }
32
33 interface JavaModuleSettingsEntity : TypedEntity {
34   val inheritedCompilerOutput: Boolean
35   val excludeOutput: Boolean
36   val compilerOutput: VirtualFileUrl?
37   val compilerOutputForTests: VirtualFileUrl?
38
39   val module: ModuleEntity
40 }
41
42 interface ModuleCustomImlDataEntity : TypedEntity {
43   val rootManagerTagCustomData: String
44   val module: ModuleEntity
45 }
46
47 interface ModuleGroupPathEntity : TypedEntity {
48   val path: List<String>
49   val module: ModuleEntity
50 }
51
52 data class ModuleId(val name: String) : PersistentEntityId<ModuleEntity>() {
53   override val parentId: PersistentEntityId<*>?
54     get() = null
55   override val presentableName: String
56     get() = name
57 }
58
59 sealed class ModuleDependencyItem {
60   sealed class Exportable : ModuleDependencyItem() {
61     abstract val exported: Boolean
62     abstract val scope: DependencyScope
63
64     abstract fun withScope(scope: DependencyScope): Exportable
65     abstract fun withExported(exported: Boolean): Exportable
66
67     data class ModuleDependency(
68       val module: ModuleId,
69       override val exported: Boolean,
70       override val scope: DependencyScope,
71       val productionOnTest: Boolean
72     ) : Exportable() {
73       override fun withScope(scope: DependencyScope): Exportable = copy(scope = scope)
74       override fun withExported(exported: Boolean): Exportable = copy(exported = exported)
75     }
76
77     data class LibraryDependency(
78       val library: LibraryId,
79       override val exported: Boolean,
80       override val scope: DependencyScope
81     ) : Exportable() {
82       override fun withScope(scope: DependencyScope): Exportable = copy(scope = scope)
83       override fun withExported(exported: Boolean): Exportable = copy(exported = exported)
84     }
85   }
86
87   //todo use LibraryProxyId to refer to SDK instead
88   data class SdkDependency(val sdkName: String, val sdkType: String) : ModuleDependencyItem()
89
90   object InheritedSdkDependency : ModuleDependencyItem()
91   object ModuleSourceDependency : ModuleDependencyItem()
92   enum class DependencyScope { COMPILE, TEST, RUNTIME, PROVIDED }
93 }
94
95 interface SourceRootEntity : TypedEntity, ReferableTypedEntity {
96   val module: ModuleEntity
97   val url: VirtualFileUrl
98   val tests: Boolean
99   val rootType: String
100 }
101
102 interface JavaSourceRootEntity : TypedEntity {
103   val sourceRoot: SourceRootEntity
104   val generated: Boolean
105   val packagePrefix: String
106 }
107
108 fun SourceRootEntity.asJavaSourceRoot(): JavaSourceRootEntity? =
109   referrers(JavaSourceRootEntity::sourceRoot).firstOrNull()
110
111 interface JavaResourceRootEntity : TypedEntity {
112   val sourceRoot: SourceRootEntity
113   val generated: Boolean
114   val relativeOutputPath: String
115 }
116
117 fun SourceRootEntity.asJavaResourceRoot() = referrers(JavaResourceRootEntity::sourceRoot).firstOrNull()
118
119 interface CustomSourceRootPropertiesEntity : TypedEntity {
120   val sourceRoot: SourceRootEntity
121   val propertiesXmlTag: String
122 }
123
124 fun SourceRootEntity.asCustomSourceRoot() = referrers(CustomSourceRootPropertiesEntity::sourceRoot).firstOrNull()
125
126 interface ContentRootEntity : TypedEntity {
127   val url: VirtualFileUrl
128   val excludedUrls: List<VirtualFileUrl>
129   val excludedPatterns: List<String>
130   val module: ModuleEntity
131 }
132
133 fun ModuleEntity.getModuleLibraries(storage: TypedEntityStorage): Sequence<LibraryEntity> {
134   return storage.entities(LibraryEntity::class.java).filter { (it.persistentId().tableId as? LibraryTableId.ModuleLibraryTableId)?.moduleId?.name == name }
135 }
136
137 val TypedEntityStorage.projectLibraries
138   get() = entities(LibraryEntity::class.java).filter { it.persistentId().tableId == LibraryTableId.ProjectLibraryTableId }
139
140 sealed class LibraryTableId {
141   data class ModuleLibraryTableId(val moduleId: ModuleId) : LibraryTableId() {
142     override val level: String
143       get() = "module"
144   }
145   object ProjectLibraryTableId : LibraryTableId() {
146     override val level: String
147       get() = "project"
148   }
149   data class GlobalLibraryTableId(override val level: String) : LibraryTableId()
150   abstract val level: String
151 }
152
153 interface LibraryEntity : TypedEntityWithPersistentId, ReferableTypedEntity {
154   val tableId: LibraryTableId
155   val name: String
156   val roots: List<LibraryRoot>
157   val excludedRoots: List<VirtualFileUrl>
158
159   @JvmDefault
160   override fun persistentId(): LibraryId = LibraryId(name, tableId)
161 }
162
163 data class LibraryId(val name: String, val tableId: LibraryTableId) : PersistentEntityId<LibraryEntity>() {
164   override val parentId: PersistentEntityId<*>?
165     get() = null
166   override val presentableName: String
167     get() = name
168 }
169
170 data class LibraryRootTypeId(val name: String)
171
172 data class LibraryRoot(
173   val url: VirtualFileUrl,
174   val type: LibraryRootTypeId,
175   val inclusionOptions: InclusionOptions
176 ) {
177
178   enum class InclusionOptions {
179     ROOT_ITSELF, ARCHIVES_UNDER_ROOT, ARCHIVES_UNDER_ROOT_RECURSIVELY
180   }
181 }
182
183 interface LibraryPropertiesEntity : TypedEntity {
184   val library: LibraryEntity
185   val libraryType: String
186   val propertiesXmlTag: String?
187 }
188
189 fun LibraryEntity.getCustomProperties() = referrers(LibraryPropertiesEntity::library).firstOrNull()
190
191 interface SdkEntity : TypedEntity {
192   val library: LibraryEntity
193   val homeUrl: VirtualFileUrl
194 }
195
196 interface FacetEntity : TypedEntityWithPersistentId, ReferableTypedEntity {
197   val name: String
198   val facetType: String
199   val configurationXmlTag: String?
200   val module: ModuleEntity
201   val underlyingFacet: FacetEntity?
202
203   @JvmDefault
204   override fun persistentId(): FacetId = FacetId(name, facetType, module.persistentId())
205 }
206
207 data class FacetId(val name: String, val type: String, override val parentId: ModuleId) : PersistentEntityId<FacetEntity>() {
208   override val presentableName: String
209     get() = name
210 }
211
212 val FacetEntity.subFacets: Sequence<FacetEntity>
213   get() = referrers(FacetEntity::underlyingFacet)
214
215 val ModuleEntity.facets: Sequence<FacetEntity>
216   get() = referrers(FacetEntity::module)
217
218
219 data class ArtifactId(val name: String) : PersistentEntityId<ArtifactEntity>() {
220   override val parentId: PersistentEntityId<*>?
221     get() = null
222   override val presentableName: String
223     get() = name
224 }
225
226 interface ArtifactEntity : TypedEntityWithPersistentId, ReferableTypedEntity {
227   val name: String
228   val artifactType: String
229   val includeInProjectBuild: Boolean
230   val outputUrl: VirtualFileUrl
231   val rootElement: CompositePackagingElementEntity
232   @JvmDefault
233   override fun persistentId(): ArtifactId = ArtifactId(name)
234
235   @JvmDefault
236   val customProperties: Sequence<ArtifactPropertiesEntity>
237     get() = referrers(ArtifactPropertiesEntity::artifact)
238
239 }
240
241 interface ArtifactPropertiesEntity : TypedEntity {
242   val artifact: ArtifactEntity
243   val providerType: String
244   val propertiesXmlTag: String?
245 }
246
247 interface PackagingElementEntity : TypedEntity
248
249 interface CompositePackagingElementEntity : PackagingElementEntity {
250   val children: List<PackagingElementEntity>
251 }
252
253 interface DirectoryPackagingElementEntity : CompositePackagingElementEntity {
254   val directoryName: String
255 }
256
257 interface ArchivePackagingElementEntity : CompositePackagingElementEntity {
258   val fileName: String
259 }
260
261 interface ArtifactRootElementEntity : CompositePackagingElementEntity
262
263 interface ArtifactOutputPackagingElementEntity : PackagingElementEntity {
264   val artifact: ArtifactId
265 }
266
267 interface ModuleOutputPackagingElementEntity : PackagingElementEntity {
268   val module: ModuleId
269 }
270
271 interface LibraryFilesPackagingElementEntity : PackagingElementEntity {
272   val library: LibraryId
273 }
274
275 interface ModuleSourcePackagingElementEntity : PackagingElementEntity {
276   val module: ModuleId
277 }
278
279 interface ModuleTestOutputPackagingElementEntity : PackagingElementEntity {
280   val module: ModuleId
281 }
282
283 interface DirectoryCopyPackagingElementEntity : PackagingElementEntity {
284   val directory: VirtualFileUrl
285 }
286
287 interface ExtractedDirectoryPackagingElementEntity : PackagingElementEntity {
288   val archive: VirtualFileUrl
289   val pathInArchive: String
290 }
291
292 interface FileCopyPackagingElementEntity : PackagingElementEntity {
293   val file: VirtualFileUrl
294   val renamedOutputFileName: String?
295 }
296
297 interface CustomPackagingElementEntity : PackagingElementEntity {
298   val typeId: String
299   val propertiesXmlTag: String
300 }