9560b848a943568bb9539d2db08afad6a4900b03
[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 : TypedEntity {
197   val name: String
198   val facetType: String
199   val configurationXmlTag: String?
200   val module: ModuleEntity
201   val underlyingFacet: FacetEntity?
202 }
203
204 val ModuleEntity.facets: Sequence<FacetEntity>
205   get() = referrers(FacetEntity::module)
206
207
208 data class ArtifactId(val name: String) : PersistentEntityId<ArtifactEntity>() {
209   override val parentId: PersistentEntityId<*>?
210     get() = null
211   override val presentableName: String
212     get() = name
213 }
214
215 interface ArtifactEntity : TypedEntityWithPersistentId, ReferableTypedEntity {
216   val name: String
217   val artifactType: String
218   val includeInProjectBuild: Boolean
219   val outputUrl: VirtualFileUrl
220   val rootElement: CompositePackagingElementEntity
221   @JvmDefault
222   override fun persistentId(): ArtifactId = ArtifactId(name)
223
224   @JvmDefault
225   val customProperties: Sequence<ArtifactPropertiesEntity>
226     get() = referrers(ArtifactPropertiesEntity::artifact)
227
228 }
229
230 interface ArtifactPropertiesEntity : TypedEntity {
231   val artifact: ArtifactEntity
232   val providerType: String
233   val propertiesXmlTag: String?
234 }
235
236 interface PackagingElementEntity : TypedEntity
237
238 interface CompositePackagingElementEntity : PackagingElementEntity {
239   val children: List<PackagingElementEntity>
240 }
241
242 interface DirectoryPackagingElementEntity : CompositePackagingElementEntity {
243   val directoryName: String
244 }
245
246 interface ArchivePackagingElementEntity : CompositePackagingElementEntity {
247   val fileName: String
248 }
249
250 interface ArtifactRootElementEntity : CompositePackagingElementEntity
251
252 interface ArtifactOutputPackagingElementEntity : PackagingElementEntity {
253   val artifact: ArtifactId
254 }
255
256 interface ModuleOutputPackagingElementEntity : PackagingElementEntity {
257   val module: ModuleId
258 }
259
260 interface LibraryFilesPackagingElementEntity : PackagingElementEntity {
261   val library: LibraryId
262 }
263
264 interface ModuleSourcePackagingElementEntity : PackagingElementEntity {
265   val module: ModuleId
266 }
267
268 interface ModuleTestOutputPackagingElementEntity : PackagingElementEntity {
269   val module: ModuleId
270 }
271
272 interface DirectoryCopyPackagingElementEntity : PackagingElementEntity {
273   val directory: VirtualFileUrl
274 }
275
276 interface ExtractedDirectoryPackagingElementEntity : PackagingElementEntity {
277   val archive: VirtualFileUrl
278   val pathInArchive: String
279 }
280
281 interface FileCopyPackagingElementEntity : PackagingElementEntity {
282   val file: VirtualFileUrl
283   val renamedOutputFileName: String?
284 }
285
286 interface CustomPackagingElementEntity : PackagingElementEntity {
287   val typeId: String
288   val propertiesXmlTag: String
289 }