diff --git a/platform/workspaceModel/codegen-impl/src/main/kotlin/com/intellij/workspaceModel/codegen/engine/impl/CodeGeneratorImpl.kt b/platform/workspaceModel/codegen-impl/src/main/kotlin/com/intellij/workspaceModel/codegen/engine/impl/CodeGeneratorImpl.kt index 840b4d4be84a..81eaede4ea30 100644 --- a/platform/workspaceModel/codegen-impl/src/main/kotlin/com/intellij/workspaceModel/codegen/engine/impl/CodeGeneratorImpl.kt +++ b/platform/workspaceModel/codegen-impl/src/main/kotlin/com/intellij/workspaceModel/codegen/engine/impl/CodeGeneratorImpl.kt @@ -6,15 +6,14 @@ import com.intellij.workspaceModel.codegen.engine.CodeGenerator import com.intellij.workspaceModel.codegen.engine.GeneratedCode import com.intellij.workspaceModel.codegen.engine.GenerationProblem import com.intellij.workspaceModel.codegen.engine.GenerationResult -import com.intellij.workspaceModel.codegen.writer.generateBuilderCode -import com.intellij.workspaceModel.codegen.writer.generateCompanionObject -import com.intellij.workspaceModel.codegen.writer.generateExtensionCode -import com.intellij.workspaceModel.codegen.writer.implWsCode +import com.intellij.workspaceModel.codegen.writer.* class CodeGeneratorImpl : CodeGenerator { override fun generate(module: CompiledObjModule): GenerationResult { val problems = ArrayList() val reporter = ProblemReporter { problems.add(it) } + + checkExtensionFields(module, reporter) val objClassToBuilderInterface = module.types.associateWith { val builderInterface = it.generateBuilderCode(reporter) builderInterface diff --git a/platform/workspaceModel/codegen-impl/src/main/kotlin/com/intellij/workspaceModel/codegen/writer/moduleChecker.kt b/platform/workspaceModel/codegen-impl/src/main/kotlin/com/intellij/workspaceModel/codegen/writer/moduleChecker.kt new file mode 100644 index 000000000000..5e7b9416061b --- /dev/null +++ b/platform/workspaceModel/codegen-impl/src/main/kotlin/com/intellij/workspaceModel/codegen/writer/moduleChecker.kt @@ -0,0 +1,16 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.workspaceModel.codegen.writer + +import com.intellij.workspaceModel.codegen.deft.meta.CompiledObjModule +import com.intellij.workspaceModel.codegen.engine.GenerationProblem +import com.intellij.workspaceModel.codegen.engine.ProblemLocation +import com.intellij.workspaceModel.codegen.engine.impl.ProblemReporter + +internal fun checkExtensionFields(module: CompiledObjModule, reporter: ProblemReporter) { + module.extensions.forEach { extProperty -> + if (!extProperty.valueType.isRefType()) { + reporter.reportProblem(GenerationProblem("Extension property is supposed to be a reference to another entity only.", + GenerationProblem.Level.ERROR, ProblemLocation.Property(extProperty))) + } + } +} diff --git a/platform/workspaceModel/codegen-impl/src/main/kotlin/com/intellij/workspaceModel/codegen/writer/refsUtilExtensions.kt b/platform/workspaceModel/codegen-impl/src/main/kotlin/com/intellij/workspaceModel/codegen/writer/refsUtilExtensions.kt index b34136ce76d3..86139e1aa239 100644 --- a/platform/workspaceModel/codegen-impl/src/main/kotlin/com/intellij/workspaceModel/codegen/writer/refsUtilExtensions.kt +++ b/platform/workspaceModel/codegen-impl/src/main/kotlin/com/intellij/workspaceModel/codegen/writer/refsUtilExtensions.kt @@ -3,6 +3,7 @@ package com.intellij.workspaceModel.codegen.writer import com.intellij.workspaceModel.codegen.deft.meta.ObjClass import com.intellij.workspaceModel.codegen.deft.meta.OwnProperty import com.intellij.workspaceModel.codegen.deft.meta.ValueType +import com.intellij.workspaceModel.codegen.writer.fields.javaType import com.intellij.workspaceModel.storage.url.VirtualFileUrl val ObjClass<*>.refsFields: List> @@ -18,7 +19,7 @@ fun ValueType<*>.getRefType(): ValueType.ObjRef<*> = when (this) { is ValueType.ObjRef<*> -> this is ValueType.Optional<*> -> type.getRefType() is ValueType.Collection<*, *> -> elementType.getRefType() - else -> error("Unsupported type of requester, should be called only if `isRefType` is true") + else -> error("${this.javaType} isn't a reference type. The method has to be called only for the reference type of fields") } fun ValueType<*>.isRefType(): Boolean = when (this) {