diff --git a/platform/script-debugger/protocol/protocol-model-generator/generated/ProtocolSchemaReaderImpl.kt b/platform/script-debugger/protocol/protocol-model-generator/generated/ProtocolSchemaReaderImpl.kt index a590896ba23f..352738cfed9a 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/generated/ProtocolSchemaReaderImpl.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/generated/ProtocolSchemaReaderImpl.kt @@ -15,18 +15,18 @@ internal class ProtocolSchemaReaderImpl : org.jetbrains.jsonProtocol.ProtocolSch private var _domains: List? = null init { - var name = preReadName - if (name == null && reader.hasNext() && reader.beginObject().hasNext()) { - name = reader.nextName() + var _n = preReadName + if (_n == null && reader.hasNext() && reader.beginObject().hasNext()) { + _n = reader.nextName() } - loop@ while (name != null) { - when (name) { + loop@ while (_n != null) { + when (_n) { "version" -> version = M1(reader, null) "domains" -> _domains = readObjectArray(reader, FM2()) else -> reader.skipValue() } - name = reader.nextNameOrNull() + _n = reader.nextNameOrNull() } reader.endObject() @@ -42,18 +42,18 @@ internal class ProtocolSchemaReaderImpl : org.jetbrains.jsonProtocol.ProtocolSch private var _minor: String? = null init { - var name = preReadName - if (name == null && reader.hasNext() && reader.beginObject().hasNext()) { - name = reader.nextName() + var _n = preReadName + if (_n == null && reader.hasNext() && reader.beginObject().hasNext()) { + _n = reader.nextName() } - loop@ while (name != null) { - when (name) { + loop@ while (_n != null) { + when (_n) { "major" -> _major = reader.nextString() "minor" -> _minor = reader.nextString() else -> reader.skipValue() } - name = reader.nextNameOrNull() + _n = reader.nextNameOrNull() } reader.endObject() @@ -69,28 +69,30 @@ internal class ProtocolSchemaReaderImpl : org.jetbrains.jsonProtocol.ProtocolSch private class M2(reader: JsonReaderEx, preReadName: String?) : org.jetbrains.jsonProtocol.ProtocolMetaModel.Domain { override var description: String? = null override var events: List? = null + override var experimental = false override var hidden = false override var types: List? = null private var _commands: List? = null private var _domain: String? = null init { - var name = preReadName - if (name == null && reader.hasNext() && reader.beginObject().hasNext()) { - name = reader.nextName() + var _n = preReadName + if (_n == null && reader.hasNext() && reader.beginObject().hasNext()) { + _n = reader.nextName() } - loop@ while (name != null) { - when (name) { - "description" -> description = reader.nextString() + loop@ while (_n != null) { + when (_n) { + "description" -> description = reader.nextNullableString() "events" -> events = readObjectArray(reader, FM5()) + "experimental" -> experimental = reader.nextBoolean() "hidden" -> hidden = reader.nextBoolean() "types" -> types = readObjectArray(reader, FM6()) "commands" -> _commands = readObjectArray(reader, FM3()) "domain" -> _domain = reader.nextString() else -> reader.skipValue() } - name = reader.nextNameOrNull() + _n = reader.nextNameOrNull() } reader.endObject() @@ -100,7 +102,7 @@ internal class ProtocolSchemaReaderImpl : org.jetbrains.jsonProtocol.ProtocolSch override fun domain() = _domain!! - override fun equals(other: Any?): Boolean = other is M2 && hidden == other.hidden && description == other.description && _domain == other._domain && events == other.events && types == other.types && _commands == other._commands + override fun equals(other: Any?): Boolean = other is M2 && experimental == other.experimental && hidden == other.hidden && description == other.description && _domain == other._domain && events == other.events && types == other.types && _commands == other._commands } private class M3(reader: JsonReaderEx, preReadName: String?) : org.jetbrains.jsonProtocol.ProtocolMetaModel.Command { @@ -112,22 +114,22 @@ internal class ProtocolSchemaReaderImpl : org.jetbrains.jsonProtocol.ProtocolSch private var _name: String? = null init { - var name = preReadName - if (name == null && reader.hasNext() && reader.beginObject().hasNext()) { - name = reader.nextName() + var _n = preReadName + if (_n == null && reader.hasNext() && reader.beginObject().hasNext()) { + _n = reader.nextName() } - loop@ while (name != null) { - when (name) { + loop@ while (_n != null) { + when (_n) { "async" -> async = reader.nextBoolean() - "description" -> description = reader.nextString() + "description" -> description = reader.nextNullableString() "hidden" -> hidden = reader.nextBoolean() "parameters" -> parameters = readObjectArray(reader, FM4()) "returns" -> returns = readObjectArray(reader, FM4()) "name" -> _name = reader.nextString() else -> reader.skipValue() } - name = reader.nextNameOrNull() + _n = reader.nextNameOrNull() } reader.endObject() @@ -151,26 +153,26 @@ internal class ProtocolSchemaReaderImpl : org.jetbrains.jsonProtocol.ProtocolSch override var type: String? = null init { - var name = preReadName - if (name == null && reader.hasNext() && reader.beginObject().hasNext()) { - name = reader.nextName() + var _n = preReadName + if (_n == null && reader.hasNext() && reader.beginObject().hasNext()) { + _n = reader.nextName() } - loop@ while (name != null) { - when (name) { - "default" -> default = reader.nextString() + loop@ while (_n != null) { + when (_n) { + "default" -> default = readRawString(reader) "hidden" -> hidden = reader.nextBoolean() "optional" -> optional = reader.nextBoolean() - "shortName" -> shortName = reader.nextString() + "shortName" -> shortName = reader.nextNullableString() "name" -> _name = reader.nextString() - "\$ref" -> ref = reader.nextString() - "description" -> description = reader.nextString() + "\$ref" -> ref = reader.nextNullableString() + "description" -> description = reader.nextNullableString() "enum" -> enum = nextList(reader) "items" -> items = M7(reader, null) - "type" -> type = reader.nextString() + "type" -> type = reader.nextNullableString() else -> reader.skipValue() } - name = reader.nextNameOrNull() + _n = reader.nextNameOrNull() } reader.endObject() @@ -189,21 +191,21 @@ internal class ProtocolSchemaReaderImpl : org.jetbrains.jsonProtocol.ProtocolSch private var _name: String? = null init { - var name = preReadName - if (name == null && reader.hasNext() && reader.beginObject().hasNext()) { - name = reader.nextName() + var _n = preReadName + if (_n == null && reader.hasNext() && reader.beginObject().hasNext()) { + _n = reader.nextName() } - loop@ while (name != null) { - when (name) { - "description" -> description = reader.nextString() + loop@ while (_n != null) { + when (_n) { + "description" -> description = reader.nextNullableString() "hidden" -> hidden = reader.nextBoolean() "optionalData" -> optionalData = reader.nextBoolean() "parameters" -> parameters = readObjectArray(reader, FM4()) "name" -> _name = reader.nextString() else -> reader.skipValue() } - name = reader.nextNameOrNull() + _n = reader.nextNameOrNull() } reader.endObject() @@ -224,23 +226,23 @@ internal class ProtocolSchemaReaderImpl : org.jetbrains.jsonProtocol.ProtocolSch override var type: String? = null init { - var name = preReadName - if (name == null && reader.hasNext() && reader.beginObject().hasNext()) { - name = reader.nextName() + var _n = preReadName + if (_n == null && reader.hasNext() && reader.beginObject().hasNext()) { + _n = reader.nextName() } - loop@ while (name != null) { - when (name) { + loop@ while (_n != null) { + when (_n) { "hidden" -> hidden = reader.nextBoolean() "id" -> _id = reader.nextString() "properties" -> properties = readObjectArray(reader, FM8()) - "description" -> description = reader.nextString() + "description" -> description = reader.nextNullableString() "enum" -> enum = nextList(reader) "items" -> items = M7(reader, null) - "type" -> type = reader.nextString() + "type" -> type = reader.nextNullableString() else -> reader.skipValue() } - name = reader.nextNameOrNull() + _n = reader.nextNameOrNull() } reader.endObject() @@ -261,23 +263,23 @@ internal class ProtocolSchemaReaderImpl : org.jetbrains.jsonProtocol.ProtocolSch override var ref: String? = null init { - var name = preReadName - if (name == null && reader.hasNext() && reader.beginObject().hasNext()) { - name = reader.nextName() + var _n = preReadName + if (_n == null && reader.hasNext() && reader.beginObject().hasNext()) { + _n = reader.nextName() } - loop@ while (name != null) { - when (name) { + loop@ while (_n != null) { + when (_n) { "optional" -> optional = reader.nextBoolean() "properties" -> properties = readObjectArray(reader, FM8()) - "description" -> description = reader.nextString() + "description" -> description = reader.nextNullableString() "enum" -> enum = nextList(reader) "items" -> items = M7(reader, null) - "type" -> type = reader.nextString() - "\$ref" -> ref = reader.nextString() + "type" -> type = reader.nextNullableString() + "\$ref" -> ref = reader.nextNullableString() else -> reader.skipValue() } - name = reader.nextNameOrNull() + _n = reader.nextNameOrNull() } reader.endObject() @@ -298,25 +300,25 @@ internal class ProtocolSchemaReaderImpl : org.jetbrains.jsonProtocol.ProtocolSch override var type: String? = null init { - var name = preReadName - if (name == null && reader.hasNext() && reader.beginObject().hasNext()) { - name = reader.nextName() + var _n = preReadName + if (_n == null && reader.hasNext() && reader.beginObject().hasNext()) { + _n = reader.nextName() } - loop@ while (name != null) { - when (name) { + loop@ while (_n != null) { + when (_n) { "hidden" -> hidden = reader.nextBoolean() "name" -> _name = reader.nextString() "optional" -> optional = reader.nextBoolean() - "shortName" -> shortName = reader.nextString() - "\$ref" -> ref = reader.nextString() - "description" -> description = reader.nextString() + "shortName" -> shortName = reader.nextNullableString() + "\$ref" -> ref = reader.nextNullableString() + "description" -> description = reader.nextNullableString() "enum" -> enum = nextList(reader) "items" -> items = M7(reader, null) - "type" -> type = reader.nextString() + "type" -> type = reader.nextNullableString() else -> reader.skipValue() } - name = reader.nextNameOrNull() + _n = reader.nextNameOrNull() } reader.endObject() diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/Generator.kt b/platform/script-debugger/protocol/protocol-model-generator/src/Generator.kt index fb1164c3bdd3..f96f35051b36 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/Generator.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/Generator.kt @@ -1,6 +1,7 @@ package org.jetbrains.protocolModelGenerator import com.intellij.openapi.util.text.StringUtil +import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.isNullOrEmpty import gnu.trove.THashMap import org.jetbrains.io.JsonReaderEx @@ -15,17 +16,28 @@ import java.util.* fun main(args: Array) { val outputDir = args[0] - val schemaUrl = args[1] - val bytes: ByteArray - if (schemaUrl.startsWith("http")) { - bytes = loadBytes(URL(schemaUrl).openStream()) + val roots = IntRange(3, args.size - 1).map { + val schemaUrl = args[it] + val bytes: ByteArray + if (schemaUrl.startsWith("http")) { + bytes = loadBytes(URL(schemaUrl).openStream()) + } + else { + bytes = Files.readAllBytes(FileSystems.getDefault().getPath(schemaUrl)) + } + val reader = JsonReaderEx(bytes.toString(Charsets.UTF_8)) + reader.isLenient = true + ProtocolSchemaReaderImpl().parseRoot(reader) } - else { - bytes = Files.readAllBytes(FileSystems.getDefault().getPath(schemaUrl)) + val mergedRoot = if (roots.size == 1) roots[0] else object : ProtocolMetaModel.Root { + override val version: ProtocolMetaModel.Version? + get() = roots[0].version + + override fun domains(): List { + return ContainerUtil.concat(roots.map { it.domains() }) + } } - val reader = JsonReaderEx(bytes.toString(Charsets.UTF_8)) - reader.isLenient = true - Generator(outputDir, args[2], args[3], ProtocolSchemaReaderImpl().parseRoot(reader)) + Generator(outputDir, args[1], args[2], mergedRoot) } private fun loadBytes(stream: InputStream): ByteArray { @@ -74,7 +86,7 @@ internal class Generator(outputDir: String, private val rootPackage: String, req val domainGeneratorMap = THashMap() for (domain in domainList) { - if (isDomainSkipped(domain)) { + if (!INCLUDED_DOMAINS.contains(domain.domain())) { System.out.println("Domain skipped: ${domain.domain()}") continue } @@ -218,14 +230,9 @@ internal class Generator(outputDir: String, private val rootPackage: String, req val READER_INTERFACE_NAME = "ProtocolResponseReader" -private fun isDomainSkipped(domain: ProtocolMetaModel.Domain): Boolean { - if (domain.domain() == "CSS" || domain.domain() == "Inspector" || domain.domain() == "Worker" || domain.domain() == "ServiceWorker") { - return false - } - // todo DOMDebugger - return domain.hidden || domain.domain() == "DOMDebugger" || domain.domain() == "Timeline" || domain.domain() == "Input" -} +private val INCLUDED_DOMAINS = arrayOf("CSS", "Debugger", "DOM", "Inspector", "Log", "Network", "Page", "Runtime", "ServiceWorker", + "Tracing", "Worker") fun generateMethodNameSubstitute(originalName: String, out: TextOutput): String { if (originalName != "this") { diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/TypeMap.kt b/platform/script-debugger/protocol/protocol-model-generator/src/TypeMap.kt index 48834773f002..097a51b9a3dc 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/TypeMap.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/TypeMap.kt @@ -12,13 +12,17 @@ internal class TypeMap { var domainGeneratorMap: Map? = null - private val typesToGenerate = ArrayList() + private val typesToGenerate = ArrayDeque() fun resolve(domainName: String, typeName: String, direction: TypeData.Direction): BoxableType? { val domainGenerator = domainGeneratorMap!!.get(domainName) if (domainGenerator == null) { val qName = "$domainName.$typeName"; - if (qName == "IO.StreamHandle" || qName == "Security.SecurityState" || qName == "Emulation.ScreenOrientation") { + if (qName == "IO.StreamHandle" || + qName == "Security.SecurityState" || + qName == "Security.CertificateId" || + qName == "Emulation.ScreenOrientation" + ) { return BoxableType.ANY_STRING // ignore } throw RuntimeException("Failed to find domain generator: $domainName for type $typeName") @@ -27,25 +31,17 @@ internal class TypeMap { } fun addTypeToGenerate(binding: StandaloneTypeBinding) { - typesToGenerate.add(binding) + typesToGenerate.offer(binding) } fun generateRequestedTypes() { // size may grow during iteration - var list = typesToGenerate.toTypedArray() - typesToGenerate.clear() - while (true) { - for (binding in list) { + val createdTypes = HashSet() + while (typesToGenerate.isNotEmpty()) { + val binding = typesToGenerate.poll() + if (createdTypes.add(binding.getJavaType().fullText)) { binding.generate() } - - if (typesToGenerate.isEmpty()) { - break - } - else { - list = typesToGenerate.toTypedArray() - typesToGenerate.clear() - } } } diff --git a/platform/script-debugger/protocol/schema-reader-generator/src/ProtocolMetaModel.kt b/platform/script-debugger/protocol/schema-reader-generator/src/ProtocolMetaModel.kt index 4f4b9fb2d6a0..39cd44dba6b8 100644 --- a/platform/script-debugger/protocol/schema-reader-generator/src/ProtocolMetaModel.kt +++ b/platform/script-debugger/protocol/schema-reader-generator/src/ProtocolMetaModel.kt @@ -71,6 +71,8 @@ interface ProtocolMetaModel { val description: String? val hidden: Boolean + + val experimental: Boolean } interface Command {