From c247c60c1dfc83c52250417d8f68f4161110e74c Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Tue, 31 Mar 2015 07:46:05 +0200 Subject: [PATCH 01/42] update WIP model/reader --- .../src/BoxableType.kt | 3 +- .../src/ClassScope.kt | 13 +- .../src/DomainGenerator.kt | 92 ++++++-------- .../protocol-model-generator/src/Generator.kt | 7 +- .../src/InputClassScope.kt | 49 +++----- .../protocol-model-generator/src/ListType.kt | 27 ++--- .../src/MemberScope.kt | 27 ++++- ...yCreateStandaloneTypeBindingVisitorBase.kt | 6 +- .../protocol-model-generator/src/NamePath.kt | 3 +- .../src/OutputClassScope.kt | 113 +++++------------- .../src/ResolveAndGenerateScope.kt | 8 +- .../src/StandaloneType.kt | 4 +- .../protocol-model-generator/src/TypeData.kt | 73 ++++------- .../protocol-model-generator/src/TypeMap.kt | 33 ++--- .../jetbrains/jsonProtocol/OutMessage.java | 28 +++-- .../protocol/protocol-reader/src/Enums.kt | 6 + 16 files changed, 200 insertions(+), 292 deletions(-) diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/BoxableType.kt b/platform/script-debugger/protocol/protocol-model-generator/src/BoxableType.kt index 6a0706012b75..9f342068f2f0 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/BoxableType.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/BoxableType.kt @@ -1,12 +1,11 @@ package org.jetbrains.protocolModelGenerator abstract class BoxableType { - abstract fun getFullText(): CharSequence abstract fun getShortText(contextNamespace: NamePath): String - abstract fun getWriteMethodName(): String + abstract val writeMethodName: String companion object { val STRING: BoxableType = StandaloneType(NamePath("String"), "writeString") diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/ClassScope.kt b/platform/script-debugger/protocol/protocol-model-generator/src/ClassScope.kt index 25da1b34ea39..01ce783aed35 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/ClassScope.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/ClassScope.kt @@ -1,5 +1,6 @@ package org.jetbrains.protocolModelGenerator +import gnu.trove.THashMap import org.jetbrains.jsonProtocol.ItemDescriptor import org.jetbrains.protocolReader.TextOutput import java.util.ArrayList @@ -7,10 +8,6 @@ import java.util.ArrayList abstract class ClassScope(val generator: DomainGenerator, val classContextNamespace: NamePath) { private val additionalMemberTexts = ArrayList(2) - protected fun getShortClassName(): String { - return classContextNamespace.lastComponent - } - fun addMember(out: TextOutConsumer) { additionalMemberTexts.add(out) } @@ -26,9 +23,7 @@ abstract class ClassScope(val generator: DomainGenerator, val classContextNamesp } } - abstract fun getTypeDirection(): TypeData.Direction - - companion object { - fun getName(named: ItemDescriptor.Named) = named.shortName() ?: named.name() - } + abstract val typeDirection: TypeData.Direction } + +fun ItemDescriptor.Named.getName() = shortName() ?: name() \ No newline at end of file diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/DomainGenerator.kt b/platform/script-debugger/protocol/protocol-model-generator/src/DomainGenerator.kt index e2e8f52d1447..3f7620eb4f49 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/DomainGenerator.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/DomainGenerator.kt @@ -88,6 +88,8 @@ class DomainGenerator(val generator: Generator, val domain: ProtocolMetaModel.Do } out.closeBlock() + + classScope.writeAdditionalMembers(out) } else { generateRequest(command, returnType) @@ -128,7 +130,7 @@ class DomainGenerator(val generator: Generator, val domain: ProtocolMetaModel.Do if (!domain.domain().isEmpty()) { out.append(domain.domain()).append('.') } - out.append(command.name()).append("\";").closeBlock() + out.append(command.name()).append('"').semi().closeBlock() } } generateTopLevelOutputClass(generator.naming.params, command.name(), command.description(), baseTypeBuilder, memberBuilder, command.parameters()) @@ -179,7 +181,19 @@ class DomainGenerator(val generator: Generator, val domain: ProtocolMetaModel.Do } override fun visitEnum(enumConstants: List): StandaloneTypeBinding { - return createStandaloneEnumInputTypeBinding(type, enumConstants, TypeData.Direction.INPUT) + val name = type.id() + return object : StandaloneTypeBinding { + override fun getJavaType() = StandaloneType(generator.naming.inputEnum.getFullName(domain.domain(), name), "writeEnum") + + override fun generate() { + val fileUpdater = generator.startJavaFile(generator.naming.inputEnum, domain, name) + fileUpdater.out.doc(type.description()) + appendEnums(enumConstants, generator.naming.inputEnum.getShortName(name), true, fileUpdater.out) + fileUpdater.update() + } + + override fun getDirection() = TypeData.Direction.INPUT + } } override fun visitArray(items: ProtocolMetaModel.ArrayItemType): StandaloneTypeBinding { @@ -187,30 +201,19 @@ class DomainGenerator(val generator: Generator, val domain: ProtocolMetaModel.Do // This class is responsible for generating ad hoc type. // If we ever are to do it, we should generate into string buffer and put strings // inside TypeDef class. - override fun getDomainName(): String { - return domain.domain() - } + override fun getDomainName() = domain.domain() - override fun getTypeDirection(): TypeData.Direction { - return TypeData.Direction.INPUT - } - - override fun resolveType(typedObject: T): TypeDescriptor { - throw UnsupportedOperationException() - } + override fun getTypeDirection() = TypeData.Direction.INPUT override fun generateNestedObject(description: String?, properties: List?) = throw UnsupportedOperationException() } - val itemBoxableType = generator.resolveType(items, resolveAndGenerateScope).type - val arrayType = ListType(itemBoxableType) - val target = object : Target { + val arrayType = ListType(generator.resolveType(items, resolveAndGenerateScope).type) + return createTypedefTypeBinding(type, object : Target { override fun resolve(context: Target.ResolveContext): BoxableType { return arrayType } - } - - return createTypedefTypeBinding(type, target, generator.naming.inputTypedef, TypeData.Direction.INPUT) + }, generator.naming.inputTypedef, TypeData.Direction.INPUT) } }) } @@ -229,11 +232,8 @@ class DomainGenerator(val generator: Generator, val domain: ProtocolMetaModel.Do val className = generator.naming.inputValue.getFullName(domain.domain(), name) val fileUpdater = generator.startJavaFile(generator.naming.inputValue, domain, name) val out = fileUpdater.out - if (type.description() != null) { - out.doc(type.description()) - } + descriptionAndRequiredImport(type.description(), out) - out.append("@org.jetbrains.jsonProtocol.JsonType").newLine() out.append("public interface ").append(className.lastComponent).openBlock() val classScope = InputClassScope(this@DomainGenerator, className) if (properties != null) { @@ -244,29 +244,7 @@ class DomainGenerator(val generator: Generator, val domain: ProtocolMetaModel.Do fileUpdater.update() } - override fun getDirection(): TypeData.Direction? { - return TypeData.Direction.INPUT - } - } - } - - fun createStandaloneEnumInputTypeBinding(type: ProtocolMetaModel.StandaloneType, enumConstants: List, direction: TypeData.Direction): StandaloneTypeBinding { - val name = type.id() - return object : StandaloneTypeBinding { - override fun getJavaType(): BoxableType { - return StandaloneType(generator.naming.inputEnum.getFullName(domain.domain(), name), "writeEnum") - } - - override fun generate() { - val fileUpdater = generator.startJavaFile(generator.naming.inputEnum, domain, name) - fileUpdater.out.doc(type.description()) - appendEnums(enumConstants, generator.naming.inputEnum.getShortName(name), true, fileUpdater.out) - fileUpdater.update() - } - - override fun getDirection(): TypeData.Direction? { - return direction - } + override fun getDirection() = TypeData.Direction.INPUT } } @@ -297,16 +275,12 @@ class DomainGenerator(val generator: Generator, val domain: ProtocolMetaModel.Do }) return object : StandaloneTypeBinding { - override fun getJavaType(): BoxableType { - return actualJavaType - } + override fun getJavaType() = actualJavaType override fun generate() { } - override fun getDirection(): TypeData.Direction? { - return direction - } + override fun getDirection() = direction } } @@ -317,7 +291,7 @@ class DomainGenerator(val generator: Generator, val domain: ProtocolMetaModel.Do val fullName = generator.naming.eventData.getFullName(domainName, event.name()).getFullText() generateJsonProtocolInterface(fileUpdater.out, className, event.description(), event.parameters(), object : TextOutConsumer { override fun append(out: TextOutput) { - out.newLine().append("org.jetbrains.wip.protocol.WipEventType<").append(fullName).append("> TYPE").newLine() + out.append("org.jetbrains.wip.protocol.WipEventType<").append(fullName).append("> TYPE").newLine() out.append("\t= new org.jetbrains.wip.protocol.WipEventType<").append(fullName).append(">") out.append("(\"").append(domainName).append('.').append(event.name()).append("\", ").append(fullName).append(".class)").openBlock() run { @@ -333,10 +307,8 @@ class DomainGenerator(val generator: Generator, val domain: ProtocolMetaModel.Do } private fun generateJsonProtocolInterface(out: TextOutput, className: String, description: String?, parameters: List?, additionalMembersText: TextOutConsumer?) { - if (description != null) { - out.doc(description) - } - out.append("@org.jetbrains.jsonProtocol.JsonType").newLine().append("public interface ").append(className).openBlock() + descriptionAndRequiredImport(description, out) + out.append("public interface ").append(className).openBlock() val classScope = InputClassScope(this, NamePath(className, NamePath(getPackageName(generator.naming.inputPackage, domain.domain())))) if (additionalMembersText != null) { classScope.addMember(additionalMembersText) @@ -347,4 +319,12 @@ class DomainGenerator(val generator: Generator, val domain: ProtocolMetaModel.Do classScope.writeAdditionalMembers(out) out.closeBlock() } + + private fun descriptionAndRequiredImport(description: String?, out: TextOutput) { + out.append("import org.jetbrains.jsonProtocol.JsonType;").newLine().newLine() + if (description != null) { + out.doc(description) + } + out.append("@JsonType").newLine() + } } \ No newline at end of file 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 fadf44a0ec4d..a120d1267904 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/Generator.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/Generator.kt @@ -1,5 +1,6 @@ package org.jetbrains.protocolModelGenerator +import gnu.trove.THashMap import org.jetbrains.jsonProtocol.* import org.jetbrains.protocolReader.FileUpdater import org.jetbrains.protocolReader.TextOutput @@ -17,6 +18,8 @@ class Generator(outputDir: String, rootPackage: String, requestClassName: String val parserRootInterfaceItems = ArrayList() val typeMap = TypeMap() + val nestedTypeMap = THashMap() + private val fileSet: FileSet val naming: Naming @@ -72,7 +75,7 @@ class Generator(outputDir: String, rootPackage: String, requestClassName: String } } - typeMap.setDomainGeneratorMap(domainGeneratorMap) + typeMap.domainGeneratorMap = domainGeneratorMap for (domainGenerator in domainGeneratorMap.values()) { domainGenerator.generateCommandsAndEvents() @@ -229,7 +232,7 @@ fun generateMethodNameSubstitute(originalName: String, out: TextOutput): String if (!BAD_METHOD_NAMES.contains(originalName)) { return originalName } - out.append("@org.jetbrains.jsonProtocol.JsonField(jsonLiteralName=\"").append(originalName).append("\")").newLine() + out.append("@org.jetbrains.jsonProtocol.JsonField(name = \"").append(originalName).append("\")").newLine() return "get" + Character.toUpperCase(originalName.charAt(0)) + originalName.substring(1) } diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/InputClassScope.kt b/platform/script-debugger/protocol/protocol-model-generator/src/InputClassScope.kt index 47eb9529f164..de5d7fc87daa 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/InputClassScope.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/InputClassScope.kt @@ -6,46 +6,27 @@ import org.jetbrains.protocolReader.TextOutput import org.jetbrains.protocolReader.appendEnums class InputClassScope(generator: DomainGenerator, namePath: NamePath) : ClassScope(generator, namePath) { - fun generateDeclarationBody(out: TextOutput, list: List) { - run { - var i = 0 - val n = list.size() - while (i < n) { - val named = list.get(i) - if (named.description() != null) { - out.doc(named.description()) - } + for (i in 0..list.size() - 1) { + val named = list.get(i) + if (named.description() != null) { + out.doc(named.description()) + } - val name = ClassScope.getName(named) - val declarationName = generateMethodNameSubstitute(name, out) - val typeDescriptor = InputMemberScope(name).resolveType(named) - typeDescriptor.writeAnnotations(out) - out.append(typeDescriptor.type.getShortText(classContextNamespace)).space().append(declarationName).append("();") - if (i != (n - 1)) { - out.newLine().newLine() - } - i++ + val name = named.getName() + val declarationName = generateMethodNameSubstitute(name, out) + val typeDescriptor = InputMemberScope(name).resolveType(named) + typeDescriptor.writeAnnotations(out) + out.append(typeDescriptor.type.getShortText(classContextNamespace)).space().append(declarationName).append("();") + if (i != (list.size() - 1)) { + out.newLine().newLine() } } } - override fun getTypeDirection(): TypeData.Direction { - return TypeData.Direction.INPUT - } + override val typeDirection = TypeData.Direction.INPUT inner class InputMemberScope(memberName: String) : MemberScope(this@InputClassScope, memberName) { - override fun generateEnum(description: String?, enumConstants: List): BoxableType { - val enumName = capitalizeFirstChar(memberName) - addMember(object : TextOutConsumer { - override fun append(out: TextOutput) { - out.newLine().doc(description) - appendEnums(enumConstants, enumName, true, out) - } - }) - return StandaloneType(NamePath(enumName, classContextNamespace), "writeEnum") - } - override fun generateNestedObject(description: String?, properties: List?): BoxableType { val objectName = capitalizeFirstChar(memberName) addMember(object : TextOutConsumer { @@ -61,8 +42,8 @@ class InputClassScope(generator: DomainGenerator, namePath: NamePath) : ClassSco for (property in properties) { out.doc(property.description()) - val methodName = generateMethodNameSubstitute(ClassScope.getName(property), out) - val memberScope = InputMemberScope(ClassScope.getName(property)) + val methodName = generateMethodNameSubstitute(property.getName(), out) + val memberScope = InputMemberScope(property.getName()) val propertyTypeData = memberScope.resolveType(property) propertyTypeData.writeAnnotations(out) diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/ListType.kt b/platform/script-debugger/protocol/protocol-model-generator/src/ListType.kt index 7ebea2b5aac5..cf85abf990da 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/ListType.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/ListType.kt @@ -2,21 +2,18 @@ package org.jetbrains.protocolModelGenerator open class ListType(private val itemType: BoxableType) : BoxableType() { - override fun getWriteMethodName(): String { - if (itemType == BoxableType.STRING) { - return "writeStringList" + override val writeMethodName: String + get() = when { + itemType == BoxableType.STRING -> { + "writeStringList" + } + itemType == BoxableType.LONG -> "writeLongArray" + itemType == BoxableType.INT -> "writeIntArray" + itemType == BoxableType.NUMBER -> "writeDoubleArray" + itemType == BoxableType.NUMBER -> "writeDoubleArray" + itemType is StandaloneType && itemType.writeMethodName == "writeEnum" -> "writeEnumList" + else -> "writeList" } - else if (itemType == BoxableType.LONG) { - return "writeLongArray" - } - else if (itemType == BoxableType.INT) { - return "writeIntArray" - } - else if (itemType == BoxableType.NUMBER) { - return "writeDoubleArray" - } - return "writeList" - } override fun getFullText(): String { if (itemType == BoxableType.LONG || itemType == BoxableType.INT || itemType == BoxableType.NUMBER) { @@ -29,6 +26,6 @@ open class ListType(private val itemType: BoxableType) : BoxableType() { if (itemType == BoxableType.LONG || itemType == BoxableType.INT || itemType == BoxableType.NUMBER) { return "${itemType.getFullText()}[]" } - return "java.util.List<" + itemType.getShortText(contextNamespace) + '>' + return "java.util.List<${itemType.getShortText(contextNamespace)}>" } } \ No newline at end of file diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/MemberScope.kt b/platform/script-debugger/protocol/protocol-model-generator/src/MemberScope.kt index 5b894585fe6c..856175f3cdfe 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/MemberScope.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/MemberScope.kt @@ -1,19 +1,34 @@ package org.jetbrains.protocolModelGenerator import org.jetbrains.jsonProtocol.ItemDescriptor +import org.jetbrains.protocolReader.TextOutput +import org.jetbrains.protocolReader.appendEnums /** * Member scope is used to generate additional types that are used only from method. * These types will be named after this method. */ -abstract class MemberScope(private val classScope: ClassScope, protected val memberName: String) : ResolveAndGenerateScope { - override fun resolveType(typedObject: T): TypeDescriptor { - return classScope.generator.generator.resolveType(typedObject, this) - } +open class MemberScope(private val classScope: ClassScope, protected val memberName: String) : ResolveAndGenerateScope { + override fun resolveType(typedObject: T) = classScope.generator.generator.resolveType(typedObject, this) - public abstract fun generateEnum(description: String?, enumConstants: List): BoxableType + fun generateEnum(description: String?, enumConstants: List): BoxableType { + val enumName = capitalizeFirstChar(memberName) + val namePath = NamePath(enumName, classScope.classContextNamespace) + var type = classScope.generator.generator.nestedTypeMap.get(namePath) + if (type == null) { + type = StandaloneType(namePath, "writeEnum") + classScope.generator.generator.nestedTypeMap.put(namePath, type) + classScope.addMember(object : TextOutConsumer { + override fun append(out: TextOutput) { + out.newLine().doc(description) + appendEnums(enumConstants, enumName, classScope.typeDirection == TypeData.Direction.INPUT, out) + } + }) + } + return type + } override fun getDomainName() = classScope.generator.domain.domain() - override fun getTypeDirection() = classScope.getTypeDirection() + override fun getTypeDirection() = classScope.typeDirection } diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/MyCreateStandaloneTypeBindingVisitorBase.kt b/platform/script-debugger/protocol/protocol-model-generator/src/MyCreateStandaloneTypeBindingVisitorBase.kt index 9f2ab28e5a32..6cbe41be2e42 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/MyCreateStandaloneTypeBindingVisitorBase.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/MyCreateStandaloneTypeBindingVisitorBase.kt @@ -34,11 +34,7 @@ class MyCreateStandaloneTypeBindingVisitorBase(private val generator: DomainGene override fun getTypeDirection() = TypeData.Direction.OUTPUT - override fun resolveType(typedObject: T) = throw UnsupportedOperationException() - - override fun generateNestedObject(description: String?, properties: List?): BoxableType { - return context.generateNestedObject("Item", description, properties) - } + override fun generateNestedObject(description: String?, properties: List?) = context.generateNestedObject("Item", description, properties) }).type) } }, generator.generator.naming.outputTypedef, TypeData.Direction.OUTPUT) diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/NamePath.kt b/platform/script-debugger/protocol/protocol-model-generator/src/NamePath.kt index 7a21c43bb74c..92760b3cf22f 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/NamePath.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/NamePath.kt @@ -1,7 +1,6 @@ package org.jetbrains.protocolModelGenerator -class NamePath(val lastComponent: String, val parent: NamePath? = null) { - +data class NamePath(val lastComponent: String, val parent: NamePath? = null) { fun getLength(): Int { var res = 1 run { diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/OutputClassScope.kt b/platform/script-debugger/protocol/protocol-model-generator/src/OutputClassScope.kt index a5fbd1a30ac4..07464c69d6fe 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/OutputClassScope.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/OutputClassScope.kt @@ -28,7 +28,7 @@ class OutputClassScope(generator: DomainGenerator, classNamePath: NamePath) : Cl generateConstructor(out, mandatoryParameters) if (mandatoryParameters.size() == 1) { val parameter = mandatoryParameters.get(0) - val typeData = OutputMemberScope(ClassScope.getName(parameter)).resolveType

(parameter) + val typeData = MemberScope(this, parameter.getName()).resolveType

(parameter) if (typeData.type.getFullText() == "int[]") { val types = arrayOfNulls(mandatoryParameters.size()) types[0] = object : ListType(BoxableType.INT) { @@ -40,9 +40,7 @@ class OutputClassScope(generator: DomainGenerator, classNamePath: NamePath) : Cl return "gnu.trove.TIntArrayList" } - override fun getWriteMethodName(): String { - return "writeIntList" - } + override val writeMethodName = "writeIntList" } out.newLine().newLine() @@ -53,13 +51,9 @@ class OutputClassScope(generator: DomainGenerator, classNamePath: NamePath) : Cl return getFullText() } - override fun getFullText(): String { - return "int" - } + override fun getFullText() = "int" - override fun getWriteMethodName(): String { - return "writeSingletonIntArray" - } + override val writeMethodName = "writeSingletonIntArray" } out.newLine().newLine() @@ -68,26 +62,18 @@ class OutputClassScope(generator: DomainGenerator, classNamePath: NamePath) : Cl } } - // generate enum classes after constructor - for (parameter in parameters) { - if (parameter.getEnum() != null) { - out.newLine().newLine() - appendEnumClass(out, parameter.description(), parameter.getEnum()!!, capitalizeFirstChar((parameter.name()))) - } - } - for (parameter in optionalParameters) { out.newLine().newLine() if (parameter.description() != null) { out.append("/**").newLine().append(" * @param v ").append(parameter.description()!!).newLine().append(" */").newLine() } - var type: CharSequence = OutputMemberScope(parameter.name()).resolveType

(parameter).type.getShortText(classContextNamespace) + var type: CharSequence = MemberScope(this, parameter.name()).resolveType

(parameter).type.getShortText(classContextNamespace) if (type == javaClass().getCanonicalName()) { type = "String" } - out.append("public ").append(getShortClassName()) + out.append("public ").append(classContextNamespace.lastComponent) out.space().append(parameter.name()).append("(").append(type) out.space().append("v").append(")").openBlock() appendWriteValueInvocation(out, parameter, "v") @@ -113,7 +99,7 @@ class OutputClassScope(generator: DomainGenerator, classNamePath: NamePath) : Cl } out.append(" */").newLine() } - out.append("public " + getShortClassName() + '(') + out.append("public " + classContextNamespace.lastComponent + '(') writeMethodParameters(out, parameters, parameterTypes) out.append(')') @@ -124,56 +110,43 @@ class OutputClassScope(generator: DomainGenerator, classNamePath: NamePath) : Cl } fun

writeWriteCalls(out: TextOutput, parameters: List

, parameterTypes: Array, qualifier: String?) { - run { - var i = 0 - val size = parameters.size() - while (i < size) { - out.newLine() + for (i in 0..parameters.size() - 1) { + out.newLine() - if (qualifier != null) { - out.append(qualifier).append('.') - } - - val parameter = parameters.get(i) - appendWriteValueInvocation(out, parameter, parameter.name(), parameterTypes[i]!!) - i++ + if (qualifier != null) { + out.append(qualifier).append('.') } + + val parameter = parameters.get(i) + appendWriteValueInvocation(out, parameter, parameter.name(), parameterTypes[i]!!) } } fun

writeMethodParameters(out: TextOutput, parameters: List

, parameterTypes: Array) { - run { - var i = 0 - val length = parameterTypes.size() - while (i < length) { - if (parameterTypes[i] == null) { - val parameter = parameters.get(i) - parameterTypes[i] = OutputMemberScope(parameter.name()).resolveType

(parameter).type - } - i++ + for (i in 0..parameterTypes.size() - 1) { + if (parameterTypes[i] == null) { + val parameter = parameters.get(i) + parameterTypes[i] = MemberScope(this, parameter.name()).resolveType

(parameter).type } } var needComa = false - run { - var i = 0 - val size = parameters.size() - while (i < size) { - if (needComa) { - out.comma() - } - else { - needComa = true - } - - out.append(parameterTypes[i]!!.getShortText(classContextNamespace)) - out.space().append(parameters.get(i).name()) - i++ + val size = parameters.size() + for (i in 0..size - 1) { + if (needComa) { + out.comma() } + else { + needComa = true + } + + val shortText = parameterTypes[i]!!.getShortText(classContextNamespace) + out.append(if (shortText == "String") "CharSequence" else shortText) + out.space().append(parameters.get(i).name()) } } - private fun appendWriteValueInvocation(out: TextOutput, parameter: ItemDescriptor.Named, valueRefName: String, type: BoxableType = OutputMemberScope(parameter.name()).resolveType(parameter).type) { + private fun appendWriteValueInvocation(out: TextOutput, parameter: ItemDescriptor.Named, valueRefName: String, type: BoxableType = MemberScope(this, parameter.name()).resolveType(parameter).type) { var blockOpened = false if (parameter.optional()) { val nullValue: String? @@ -199,34 +172,12 @@ class OutputClassScope(generator: DomainGenerator, classNamePath: NamePath) : Cl } } // todo CallArgument (we should allow write null as value) - out.append(if (parameter.name() == "value" && type.getWriteMethodName() == "writeString") "writeNullableString" else type.getWriteMethodName()).append("(") + out.append(if (parameter.name() == "value" && type.writeMethodName == "writeString") "writeNullableString" else type.writeMethodName).append("(") out.quote(parameter.name()).comma().append(valueRefName).append(");") if (blockOpened) { out.closeBlock() } } - override fun getTypeDirection(): TypeData.Direction { - return TypeData.Direction.OUTPUT - } - - inner class OutputMemberScope(memberName: String) : MemberScope(this@OutputClassScope, memberName) { - override fun generateEnum(description: String?, enumConstants: List): BoxableType { - return StandaloneType(NamePath(capitalizeFirstChar(memberName), classContextNamespace), "writeEnum") - } - - override fun generateNestedObject(description: String?, properties: List?) = throw UnsupportedOperationException() - } - - private fun appendEnumClass(out: TextOutput, description: String?, enumConstants: List, enumName: String) { - out.doc(description) - appendEnums(enumConstants, enumName, false, out) - out.newLine().append("private final String protocolValue;").newLine() - out.newLine().append(enumName).append("(String protocolValue)").openBlock() - out.append("this.protocolValue = protocolValue;").closeBlock() - - out.newLine().newLine().append("public String toString()").openBlock() - out.append("return protocolValue;").closeBlock() - out.closeBlock() - } + override val typeDirection = TypeData.Direction.OUTPUT } diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/ResolveAndGenerateScope.kt b/platform/script-debugger/protocol/protocol-model-generator/src/ResolveAndGenerateScope.kt index 06169af195b1..cc483e6cb08a 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/ResolveAndGenerateScope.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/ResolveAndGenerateScope.kt @@ -4,10 +4,10 @@ import org.jetbrains.jsonProtocol.ItemDescriptor import org.jetbrains.jsonProtocol.ProtocolMetaModel trait ResolveAndGenerateScope { - public fun getDomainName(): String - public fun getTypeDirection(): TypeData.Direction + fun getDomainName(): String + fun getTypeDirection(): TypeData.Direction - public fun resolveType(typedObject: T): TypeDescriptor + fun resolveType(typedObject: T): TypeDescriptor = throw UnsupportedOperationException() - public fun generateNestedObject(description: String?, properties: List?): BoxableType + open fun generateNestedObject(description: String?, properties: List?): BoxableType = throw UnsupportedOperationException() } diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/StandaloneType.kt b/platform/script-debugger/protocol/protocol-model-generator/src/StandaloneType.kt index c77e52f7adac..2730a59c161f 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/StandaloneType.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/StandaloneType.kt @@ -1,8 +1,6 @@ package org.jetbrains.protocolModelGenerator -class StandaloneType(private val namePath: NamePath, private val writeMethodName: String) : BoxableType() { - override fun getWriteMethodName() = writeMethodName - +class StandaloneType(private val namePath: NamePath, override val writeMethodName: String) : BoxableType() { override fun getFullText() = namePath.getFullText() override fun getShortText(contextNamespace: NamePath): String { diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/TypeData.kt b/platform/script-debugger/protocol/protocol-model-generator/src/TypeData.kt index 24ffcc5af7b7..02532666d22d 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/TypeData.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/TypeData.kt @@ -1,10 +1,25 @@ package org.jetbrains.protocolModelGenerator import org.jetbrains.jsonProtocol.ProtocolMetaModel +import kotlin.properties.Delegates + +val ANY = object : StandaloneTypeBinding { + override fun getJavaType() = BoxableType.ANY_STRING + + override fun generate() { + } + + override fun getDirection() = null +} class TypeData(private val name: String) { - private var input: Input? = null - private var output: Output? = null + val input: Input by Delegates.lazy { + Input() + } + + val output: Output by Delegates.lazy { + Output() + } private var type: ProtocolMetaModel.StandaloneType? = null private var commonBinding: StandaloneTypeBinding? = null @@ -13,41 +28,14 @@ class TypeData(private val name: String) { this.type = type } - fun getInput(): Input { - if (input == null) { - input = Input() - } - return input!! - } - - fun getOutput(): Output { - if (output == null) { - output = Output() - } - return output!! - } - - fun get(direction: Direction): TypeRef { - return direction.get(this) - } - - fun checkComplete() { - if (input != null) { - input!!.checkResolved() - } - if (output != null) { - output!!.checkResolved() - } - } - - abstract class Direction { + abstract class Direction { companion object { val INPUT = object : Direction() { - override fun get(typeData: TypeData) = typeData.getInput() + override fun get(typeData: TypeData) = typeData.input } val OUTPUT = object : Direction() { - override fun get(typeData: TypeData) = typeData.getOutput() + override fun get(typeData: TypeData) = typeData.output } } @@ -80,12 +68,6 @@ class TypeData(private val name: String) { } abstract fun resolveImpl(domainGenerator: DomainGenerator): StandaloneTypeBinding? - - fun checkResolved() { - if (type == null && !(name == "int" || name == "any")) { - throw RuntimeException() - } - } } inner class Output : TypeRef() { @@ -141,17 +123,4 @@ class TypeData(private val name: String) { return domainGenerator.createStandaloneInputTypeBinding(type!!) } } -} - -public val ANY: StandaloneTypeBinding = object : StandaloneTypeBinding { - override fun getJavaType(): BoxableType { - return BoxableType.ANY_STRING - } - - override fun generate() { - } - - override fun getDirection(): TypeData.Direction? { - return null - } -} +} \ No newline at end of file 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 f12451d22f68..26bd05474c9d 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/TypeMap.kt +++ b/platform/script-debugger/protocol/protocol-model-generator/src/TypeMap.kt @@ -9,34 +9,39 @@ import java.util.ArrayList */ class TypeMap { private val map = THashMap, TypeData>() - private var domainGeneratorMap: Map? = null - private val typesToGenerate = ArrayList() - fun setDomainGeneratorMap(domainGeneratorMap: Map) { - this.domainGeneratorMap = domainGeneratorMap - } + var domainGeneratorMap: Map? = null + + private val typesToGenerate = ArrayList() fun resolve(domainName: String, typeName: String, direction: TypeData.Direction): BoxableType? { val domainGenerator = domainGeneratorMap!!.get(domainName) if (domainGenerator == null) { throw RuntimeException("Failed to find domain generator: " + domainName) } - return getTypeData(domainName, typeName).get(direction).resolve(this, domainGenerator) + return direction.get(getTypeData(domainName, typeName)).resolve(this, domainGenerator) } fun addTypeToGenerate(binding: StandaloneTypeBinding) { typesToGenerate.add(binding) } - public fun generateRequestedTypes() { - // Size may grow during iteration. - //noinspection ForLoopReplaceableByForEach - for (i in typesToGenerate.indices) { - typesToGenerate.get(i).generate() - } + fun generateRequestedTypes() { + // size may grow during iteration + var list = typesToGenerate.copyToArray() + typesToGenerate.clear() + while (true) { + for (binding in list) { + binding.generate() + } - for (typeData in map.values()) { - typeData.checkComplete() + if (typesToGenerate.isEmpty()) { + break + } + else { + list = typesToGenerate.copyToArray() + typesToGenerate.clear() + } } } diff --git a/platform/script-debugger/protocol/protocol-reader-runtime/src/org/jetbrains/jsonProtocol/OutMessage.java b/platform/script-debugger/protocol/protocol-reader-runtime/src/org/jetbrains/jsonProtocol/OutMessage.java index 29f48668782c..eafed16420a0 100644 --- a/platform/script-debugger/protocol/protocol-reader-runtime/src/org/jetbrains/jsonProtocol/OutMessage.java +++ b/platform/script-debugger/protocol/protocol-reader-runtime/src/org/jetbrains/jsonProtocol/OutMessage.java @@ -52,7 +52,7 @@ public abstract class OutMessage { protected void beginArguments() throws IOException { } - protected final void writeEnum(String name, Enum value) { + public final void writeEnum(String name, Enum value) { try { beginArguments(); writer.name(name).value(value.toString()); @@ -62,7 +62,7 @@ public abstract class OutMessage { } } - protected final void writeMap(String name, Map value) { + public final void writeMap(String name, Map value) { try { beginArguments(); writer.name(name); @@ -185,7 +185,7 @@ public abstract class OutMessage { } } - protected final void writeList(String name, List value) { + public final void writeList(String name, List value) { if (value == null || value.isEmpty()) { return; } @@ -227,7 +227,7 @@ public abstract class OutMessage { } } - protected final void writeStringList(@NotNull String name, @NotNull Collection value) { + public final void writeStringList(@NotNull String name, @NotNull Collection value) { try { beginArguments(); JsonWriters.writeStringList(writer, name, value); @@ -237,6 +237,20 @@ public abstract class OutMessage { } } + public final void writeEnumList(@NotNull String name, @NotNull Collection> values) { + try { + beginArguments(); + writer.name(name).beginArray(); + for (Enum item : values) { + writer.value(item.toString()); + } + writer.endArray(); + } + catch (IOException e) { + throw new RuntimeException(e); + } + } + public static void prepareWriteRaw(@NotNull OutMessage message, @NotNull String name) throws IOException { message.writer.name(name).nullValue(); ByteBuf itemBuffer = message.buffer; @@ -247,7 +261,7 @@ public abstract class OutMessage { ByteBufUtilEx.writeUtf8(message.buffer, rawValue); } - protected final void writeMessage(@NotNull String name, @NotNull OutMessage value) { + public final void writeMessage(@NotNull String name, @NotNull OutMessage value) { try { beginArguments(); prepareWriteRaw(this, name); @@ -317,10 +331,10 @@ public abstract class OutMessage { } } - public final void writeNullableString(@NotNull String name, @Nullable String value) { + public final void writeNullableString(@NotNull String name, @Nullable CharSequence value) { try { beginArguments(); - writer.name(name).value(value); + writer.name(name).value(value.toString()); } catch (IOException e) { throw new RuntimeException(e); diff --git a/platform/script-debugger/protocol/protocol-reader/src/Enums.kt b/platform/script-debugger/protocol/protocol-reader/src/Enums.kt index da87c7aba8ba..2383f63c6aec 100644 --- a/platform/script-debugger/protocol/protocol-reader/src/Enums.kt +++ b/platform/script-debugger/protocol/protocol-reader/src/Enums.kt @@ -26,5 +26,11 @@ fun appendEnums(enumConstants: List, enumName: String, input: Boolean, o } else { out.semi().newLine() + out.newLine().append("private final String protocolValue;").newLine() + out.newLine().append(enumName).append("(String protocolValue)").openBlock() + out.append("this.protocolValue = protocolValue;").closeBlock() + out.newLine().newLine().append("public String toString()").openBlock() + out.append("return protocolValue;").closeBlock() + out.closeBlock() } } \ No newline at end of file From 7cb783f35e544d0ee0d818c7805688cb773609ac Mon Sep 17 00:00:00 2001 From: Andrey Vokin Date: Mon, 30 Mar 2015 18:54:58 +0300 Subject: [PATCH 02/42] Heroku. ProductivityFeatures for Heroku removed --- platform/remote-servers/impl/src/META-INF/RemoteServers.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/platform/remote-servers/impl/src/META-INF/RemoteServers.xml b/platform/remote-servers/impl/src/META-INF/RemoteServers.xml index 287c8c945af8..64d832417ef6 100644 --- a/platform/remote-servers/impl/src/META-INF/RemoteServers.xml +++ b/platform/remote-servers/impl/src/META-INF/RemoteServers.xml @@ -27,8 +27,6 @@ - - From 6b27187749bf5ed042df0f587e85ef5a1e3d6d45 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Tue, 31 Mar 2015 12:30:53 +0300 Subject: [PATCH 03/42] avoid NPEs in command-line diff application --- .../impl/text/PsiAwareTextEditorProvider.java | 22 ++++++++++--------- .../impl/text/TextEditorComponent.java | 7 ++++-- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/text/PsiAwareTextEditorProvider.java b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/text/PsiAwareTextEditorProvider.java index 217e6051a102..c28fea82162c 100644 --- a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/text/PsiAwareTextEditorProvider.java +++ b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/text/PsiAwareTextEditorProvider.java @@ -56,17 +56,19 @@ public class PsiAwareTextEditorProvider extends TextEditorProvider implements As LOG.error("Cannot open text editor for " + file); } CodeFoldingState state = null; - try { - Document document = FileDocumentManager.getInstance().getDocument(file); - if (document != null) { - state = CodeFoldingManager.getInstance(project).buildInitialFoldings(document); + if (!project.isDefault()) { // There's no CodeFoldingManager for default project (which is used in diff command-line application) + try { + Document document = FileDocumentManager.getInstance().getDocument(file); + if (document != null) { + state = CodeFoldingManager.getInstance(project).buildInitialFoldings(document); + } + } + catch (ProcessCanceledException e) { + throw e; + } + catch (Exception e) { + LOG.error("Error building initial foldings", e); } - } - catch (ProcessCanceledException e) { - throw e; - } - catch (Exception e) { - LOG.error("Error building initial foldings", e); } final CodeFoldingState finalState = state; return new Builder() { diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java index a476264b8285..d24b810b3ca4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java @@ -133,7 +133,9 @@ class TextEditorComponent extends JBLoadingPanel implements DataProvider { */ void dispose(){ myDocument.removeDocumentListener(myDocumentListener); - EditorHistoryManager.getInstance(myProject).updateHistoryEntry(myFile, false); + if (!myProject.isDefault()) { // There's no EditorHistoryManager for default project (which is used in diff command-line application) + EditorHistoryManager.getInstance(myProject).updateHistoryEntry(myFile, false); + } disposeEditor(myEditor); myConnection.disconnect(); @@ -276,7 +278,8 @@ class TextEditorComponent extends JBLoadingPanel implements DataProvider { final Editor e = validateCurrentEditor(); if (e == null) return null; - if (!myProject.isDisposed()) { + // There's no FileEditorManager for default project (which is used in diff command-line application) + if (!myProject.isDisposed() && !myProject.isDefault()) { final Object o = FileEditorManager.getInstance(myProject).getData(dataId, e, e.getCaretModel().getCurrentCaret()); if (o != null) return o; } From 1c459ebd9122c448b92568187c485e522dd62f4d Mon Sep 17 00:00:00 2001 From: Rustam Vishnyakov Date: Mon, 30 Mar 2015 19:23:10 +0300 Subject: [PATCH 04/42] Brighter right margin color in Darcula to make it distinguishable from template background (IDEA-138124 New release (141.177) breaks right margin display in editor) --- platform/platform-resources/src/DefaultColorSchemesManager.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-resources/src/DefaultColorSchemesManager.xml b/platform/platform-resources/src/DefaultColorSchemesManager.xml index 9922db4edd17..0151dbbf7529 100644 --- a/platform/platform-resources/src/DefaultColorSchemesManager.xml +++ b/platform/platform-resources/src/DefaultColorSchemesManager.xml @@ -1157,7 +1157,7 @@