From fb83d4983f1ad915653bbbd2829e08137b1b3ac5 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Wed, 7 Jan 2015 13:19:56 +0100 Subject: [PATCH] cleanup, prepare to fix WEB-14597 Breakpoints being ignored if functions called from live console --- .../protocolReader/ClassNameScheme.java | 6 +- .../jetbrains/protocolReader/ClassScope.java | 11 +- ...reateStandaloneTypeBindingVisitorBase.java | 8 +- .../protocolReader/DomainGenerator.java | 146 +++++++++++++----- .../jetbrains/protocolReader/Generator.java | 16 +- ...reateStandaloneTypeBindingVisitorBase.java | 4 +- .../protocolReader/OutputClassScope.java | 65 ++++---- .../jetbrains/jsonProtocol/OutMessage.java | 2 +- .../protocolReader/ExistingSubtypeAspect.java | 18 ++- .../jetbrains/protocolReader/FileUpdater.java | 8 +- 10 files changed, 184 insertions(+), 100 deletions(-) diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/ClassNameScheme.java b/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/ClassNameScheme.java index 1c858fa20c8c..43fc7d6b0534 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/ClassNameScheme.java +++ b/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/ClassNameScheme.java @@ -16,11 +16,9 @@ abstract class ClassNameScheme { return new NamePath(getShortName(baseName), new NamePath(getPackageNameVirtual(domainName))); } + @NotNull String getShortName(@NotNull String baseName) { - if (baseName.endsWith("Descriptor")) { - return baseName; - } - return new String(getShortNameChars(baseName)); + return baseName.endsWith("Descriptor") ? baseName : new String(getShortNameChars(baseName)); } private char[] getShortNameChars(@NotNull String baseName) { diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/ClassScope.java b/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/ClassScope.java index 31ba16f3438c..ccf0bee043fe 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/ClassScope.java +++ b/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/ClassScope.java @@ -11,7 +11,7 @@ abstract class ClassScope { private final NamePath contextNamespace; final DomainGenerator generator; - ClassScope(DomainGenerator generator, NamePath classNamespace) { + ClassScope(@NotNull DomainGenerator generator, @NotNull NamePath classNamespace) { contextNamespace = classNamespace; this.generator = generator; } @@ -24,11 +24,16 @@ abstract class ClassScope { return contextNamespace; } - void addMember(TextOutConsumer out) { + void addMember(@NotNull TextOutConsumer out) { additionalMemberTexts.add(out); } - void writeAdditionalMembers(TextOutput out) { + void writeAdditionalMembers(@NotNull TextOutput out) { + if (additionalMemberTexts.isEmpty()) { + return; + } + + out.newLine(); for (TextOutConsumer deferredWriter : additionalMemberTexts) { deferredWriter.append(out); } diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/CreateStandaloneTypeBindingVisitorBase.java b/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/CreateStandaloneTypeBindingVisitorBase.java index cf2a64094cc6..d0653004cc42 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/CreateStandaloneTypeBindingVisitorBase.java +++ b/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/CreateStandaloneTypeBindingVisitorBase.java @@ -17,12 +17,12 @@ abstract class CreateStandaloneTypeBindingVisitorBase implements TypeVisitor 0 ? name.substring(0, i) + 'B' + name.substring(i + 1) : name; + } + void generateCommandsAndEvents() throws IOException { + FileUpdater requestsFileUpdater = generator.startJavaFile(generator.naming.params.getPackageNameVirtual(domain.domain()), "Requests.java"); + TextOutput out = requestsFileUpdater.out; + out.append("import org.jetbrains.annotations.NotNull;").newLine(); + out.append("import org.jetbrains.jsonProtocol.Request;").newLine(); + out.newLine().append("public final class ").append("Requests"); + out.openBlock(); + + boolean isFirst = true; + for (ProtocolMetaModel.Command command : domain.commands()) { boolean hasResponse = command.returns() != null; - generateCommandParams(command, hasResponse); + + boolean onlyMandatoryParams = true; + List params = command.parameters(); + boolean hasParams = params != null && !params.isEmpty(); + if (hasParams) { + for (ProtocolMetaModel.Parameter parameter : params) { + if (parameter.optional()) { + onlyMandatoryParams = false; + } + } + } + + String returnType = hasResponse ? generator.naming.commandResult.getShortName(command.name()) : "Void"; + if (onlyMandatoryParams) { + if (isFirst) { + isFirst = false; + } + else { + out.newLine().newLine(); + } + out.append("@NotNull").newLine().append("public static Request<"); + out.append(returnType); + out.append(">").space().append(fixMethodName(command.name())).append("("); + + OutputClassScope classScope = new OutputClassScope(this, generator.naming.params.getFullName(domain.domain(), command.name())); + BoxableType[] parameterTypes = hasParams ? new BoxableType[params.size()] : null; + if (hasParams) { + classScope.writeMethodParameters(out, params, parameterTypes); + } + + out.append(')').openBlock(); + + if (hasParams) { + out.append("V8SimpleRequest<").append(returnType).append(">").append(" r ="); + } + else { + out.append("return"); + } + + out.append(" new V8SimpleRequest<").append(returnType).append(">(\""); + if (!domain.domain().isEmpty()) { + out.append(domain.domain()).append('.'); + } + out.append(command.name()).append("\")").semi(); + + if (hasParams) { + classScope.writeWriteCalls(out, params, parameterTypes, "r"); + out.newLine().append("return r").semi(); + } + + out.closeBlock(); + } + else { + generateRequest(command, returnType); + } + if (hasResponse) { - String className = generator.getNaming().commandResult.getShortName(command.name()); - FileUpdater fileUpdater = generator.startJavaFile(generator.getNaming().commandResult, domain, command.name()); - generateJsonProtocolInterface(fileUpdater.out, className, command.description(), command.returns(), null); + FileUpdater fileUpdater = generator.startJavaFile(generator.naming.commandResult, domain, command.name()); + generateJsonProtocolInterface(fileUpdater.out, generator.naming.commandResult.getShortName(command.name()), command.description(), command.returns(), null); fileUpdater.update(); - String dataFullName = generator.getNaming().commandResult.getFullName(domain.domain(), command.name()).getFullText(); - generator.jsonProtocolParserClassNames.add(dataFullName); - generator.parserRootInterfaceItems.add(new ParserRootInterfaceItem(domain.domain(), command.name(), generator.getNaming().commandResult)); + generator.jsonProtocolParserClassNames.add(generator.naming.commandResult.getFullName(domain.domain(), command.name()).getFullText()); + generator.parserRootInterfaceItems.add(new ParserRootInterfaceItem(domain.domain(), command.name(), generator.naming.commandResult)); } } + out.closeBlock(); + requestsFileUpdater.update(); + if (domain.events() != null) { for (ProtocolMetaModel.Event event : domain.events()) { generateEvenData(event); - generator.jsonProtocolParserClassNames.add(generator.getNaming().eventData.getFullName(domain.domain(), event.name()).getFullText()); - generator.parserRootInterfaceItems.add(new ParserRootInterfaceItem(domain.domain(), event.name(), generator.getNaming().eventData)); + generator.jsonProtocolParserClassNames.add(generator.naming.eventData.getFullName(domain.domain(), event.name()).getFullText()); + generator.parserRootInterfaceItems.add(new ParserRootInterfaceItem(domain.domain(), event.name(), generator.naming.eventData)); } } } - private void generateCommandParams(final ProtocolMetaModel.Command command, final boolean hasResponse) throws IOException { + private void generateRequest(@NotNull final ProtocolMetaModel.Command command, @NotNull final String returnType) throws IOException { TextOutConsumer baseTypeBuilder = new TextOutConsumer() { @Override public void append(TextOutput out) { - out.space().append("extends ").append(generator.getNaming().requestClassName); - if (hasResponse) { - out.space().append("implements org.jetbrains.jsonProtocol.Request"); - } + out.space().append("extends ").append(generator.naming.requestClassName).append('<').append(returnType).append('>'); } }; TextOutConsumer memberBuilder = new TextOutConsumer() { @Override public void append(TextOutput out) { - out.newLine().append("@Override").newLine().append("public String getMethodName()").openBlock(); + out.append("@NotNull").newLine().append("@Override").newLine().append("public String getMethodName()").openBlock(); out.append("return \""); if (!domain.domain().isEmpty()) { out.append(domain.domain()).append('.'); @@ -72,28 +139,29 @@ class DomainGenerator { out.append(command.name()).append("\";").closeBlock(); } }; - generateTopLevelOutputClass(generator.getNaming().params, command.name(), command.description(), baseTypeBuilder, + generateTopLevelOutputClass(generator.naming.params, command.name(), command.description(), baseTypeBuilder, memberBuilder, command.parameters()); } void generateCommandAdditionalParam(ProtocolMetaModel.StandaloneType type) throws IOException { - generateTopLevelOutputClass(generator.getNaming().additionalParam, type.id(), type.description(), null, null, type.properties()); + generateTopLevelOutputClass(generator.naming.additionalParam, type.id(), type.description(), null, null, type.properties()); } - private

void generateTopLevelOutputClass(ClassNameScheme nameScheme, + private

void generateTopLevelOutputClass(@NotNull ClassNameScheme nameScheme, String baseName, String description, - TextOutConsumer baseType, - TextOutConsumer additionalMemberText, + @Nullable TextOutConsumer baseType, + @Nullable TextOutConsumer additionalMemberText, List

properties) throws IOException { FileUpdater fileUpdater = generator.startJavaFile(nameScheme, domain, baseName); - TextOutput out = fileUpdater.out; - NamePath classNamePath = nameScheme.getFullName(domain.domain(), baseName); - generateOutputClass(out, classNamePath, description, baseType, additionalMemberText, properties); + if (nameScheme == generator.naming.params) { + fileUpdater.out.append("import org.jetbrains.annotations.NotNull;").newLine().newLine(); + } + generateOutputClass(fileUpdater.out, nameScheme.getFullName(domain.domain(), baseName), description, baseType, additionalMemberText, properties); fileUpdater.update(); } - private

void generateOutputClass(TextOutput out, + private

void generateOutputClass(@NotNull TextOutput out, NamePath classNamePath, String description, @Nullable TextOutConsumer baseType, @@ -172,14 +240,14 @@ class DomainGenerator { } }; - return createTypedefTypeBinding(getType(), target, generator.getNaming().inputTypedef, TypeData.Direction.INPUT); + return createTypedefTypeBinding(getType(), target, generator.naming.inputTypedef, TypeData.Direction.INPUT); } }); } StandaloneTypeBinding createStandaloneObjectInputTypeBinding(@NotNull final ProtocolMetaModel.StandaloneType type, @Nullable final List properties) { final String name = type.id(); - final NamePath fullTypeName = generator.getNaming().inputValue.getFullName(domain.domain(), name); + final NamePath fullTypeName = generator.naming.inputValue.getFullName(domain.domain(), name); generator.jsonProtocolParserClassNames.add(fullTypeName.getFullText()); return new StandaloneTypeBinding() { @@ -190,8 +258,8 @@ class DomainGenerator { @Override public void generate() throws IOException { - NamePath className = generator.getNaming().inputValue.getFullName(domain.domain(), name); - FileUpdater fileUpdater = generator.startJavaFile(generator.getNaming().inputValue, domain, name); + NamePath className = generator.naming.inputValue.getFullName(domain.domain(), name); + FileUpdater fileUpdater = generator.startJavaFile(generator.naming.inputValue, domain, name); TextOutput out = fileUpdater.out; if (type.description() != null) { out.doc(type.description()); @@ -220,14 +288,14 @@ class DomainGenerator { return new StandaloneTypeBinding() { @Override public BoxableType getJavaType() { - return new StandaloneType(generator.getNaming().inputEnum.getFullName(domain.domain(), name), "writeEnum"); + return new StandaloneType(generator.naming.inputEnum.getFullName(domain.domain(), name), "writeEnum"); } @Override public void generate() throws IOException { - FileUpdater fileUpdater = generator.startJavaFile(generator.getNaming().inputEnum, domain, name); + FileUpdater fileUpdater = generator.startJavaFile(generator.naming.inputEnum, domain, name); fileUpdater.out.doc(type.description()); - Enums.appendEnums(enumConstants, generator.getNaming().inputEnum.getShortName(name), true, fileUpdater.out); + Enums.appendEnums(enumConstants, generator.naming.inputEnum.getShortName(name), true, fileUpdater.out); fileUpdater.update(); } @@ -246,7 +314,6 @@ class DomainGenerator { final ClassNameScheme nameScheme, final TypeData.Direction direction) { final String name = type.id(); final NamePath typedefJavaName = nameScheme.getFullName(domain.domain(), name); - final List deferredWriters = new ArrayList<>(); final BoxableType actualJavaType = target.resolve(new StandaloneTypeBinding.Target.ResolveContext() { @Override public BoxableType generateNestedObject(String shortName, String description, List properties) { @@ -261,7 +328,6 @@ class DomainGenerator { case OUTPUT: TextOutput out = new TextOutput(new StringBuilder()); generateOutputClass(out, classNamePath, description, null, null, properties); - deferredWriters.add(out); break; default: throw new RuntimeException(); @@ -288,10 +354,10 @@ class DomainGenerator { } private void generateEvenData(final ProtocolMetaModel.Event event) throws IOException { - String className = generator.getNaming().eventData.getShortName(event.name()); - FileUpdater fileUpdater = generator.startJavaFile(generator.getNaming().eventData, domain, event.name()); + String className = generator.naming.eventData.getShortName(event.name()); + FileUpdater fileUpdater = generator.startJavaFile(generator.naming.eventData, domain, event.name()); final String domainName = domain.domain(); - final CharSequence fullName = generator.getNaming().eventData.getFullName(domainName, event.name()).getFullText(); + final CharSequence fullName = generator.naming.eventData.getFullName(domainName, event.name()).getFullText(); generateJsonProtocolInterface(fileUpdater.out, className, event.description(), event.parameters(), new TextOutConsumer() { @Override public void append(TextOutput out) { @@ -300,8 +366,8 @@ class DomainGenerator { out.append("(\"").append(domainName).append('.').append(event.name()).append("\", ").append(fullName).append(".class)").openBlock(); { out.append("@Override").newLine().append("public ").append(fullName).append(" read("); - out.append(generator.getNaming().inputPackage).append('.').append(Generator.READER_INTERFACE_NAME + " protocolReader, ").append(Util.JSON_READER_PARAMETER_DEF).append(")").openBlock(); - out.append("return protocolReader.").append(generator.getNaming().eventData.getParseMethodName(domainName, event.name())).append("(reader);").closeBlock(); + out.append(generator.naming.inputPackage).append('.').append(Generator.READER_INTERFACE_NAME + " protocolReader, ").append(Util.JSON_READER_PARAMETER_DEF).append(")").openBlock(); + out.append("return protocolReader.").append(generator.naming.eventData.getParseMethodName(domainName, event.name())).append("(reader);").closeBlock(); } out.closeBlock(); out.semi(); @@ -315,7 +381,7 @@ class DomainGenerator { out.doc(description); } out.append("@org.jetbrains.jsonProtocol.JsonType").newLine().append("public interface ").append(className).openBlock(); - InputClassScope classScope = new InputClassScope(this, new NamePath(className, new NamePath(ClassNameScheme.getPackageName(generator.getNaming().inputPackage, domain.domain())))); + InputClassScope classScope = new InputClassScope(this, new NamePath(className, new NamePath(ClassNameScheme.getPackageName(generator.naming.inputPackage, domain.domain())))); if (additionalMembersText != null) { classScope.addMember(additionalMembersText); } diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/Generator.java b/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/Generator.java index b02905ad51ad..abd58b0a8c6e 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/Generator.java +++ b/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/Generator.java @@ -25,17 +25,13 @@ class Generator { final TypeMap typeMap = new TypeMap(); private final FileSet fileSet; - private final Naming naming; + final Naming naming; Generator(String outputDir, String rootPackage, String requestClassName) throws IOException { fileSet = new FileSet(FileSystems.getDefault().getPath(outputDir)); naming = new Naming(rootPackage, requestClassName); } - public Naming getNaming() { - return naming; - } - public static final class Naming { public final ClassNameScheme params; public final ClassNameScheme additionalParam; @@ -172,7 +168,7 @@ class Generator { } private void generateParserInterfaceList() throws IOException { - FileUpdater fileUpdater = startJavaFile(getNaming().inputPackage, PARSER_INTERFACE_LIST_CLASS_NAME + ".java"); + FileUpdater fileUpdater = startJavaFile(naming.inputPackage, PARSER_INTERFACE_LIST_CLASS_NAME + ".java"); // Write classes in stable order. Collections.sort(jsonProtocolParserClassNames); @@ -189,7 +185,7 @@ class Generator { } private void generateParserRoot(List parserRootInterfaceItems) throws IOException { - FileUpdater fileUpdater = startJavaFile(getNaming().inputPackage, READER_INTERFACE_NAME + ".java"); + FileUpdater fileUpdater = startJavaFile(naming.inputPackage, READER_INTERFACE_NAME + ".java"); // Write classes in stable order. Collections.sort(parserRootInterfaceItems); @@ -217,7 +213,7 @@ class Generator { item.appendReadMethodName(out); out.append("(reader)").semi().newLine(); } - out.append("else throw new IllegalArgumentException(methodName)").semi(); + out.append("else return null").semi(); out.closeBlock(); out.closeBlock(); @@ -258,11 +254,11 @@ class Generator { return s; } - FileUpdater startJavaFile(ClassNameScheme nameScheme, Domain domain, String baseName) throws IOException { + FileUpdater startJavaFile(@NotNull ClassNameScheme nameScheme, Domain domain, String baseName) throws IOException { return startJavaFile(nameScheme.getPackageNameVirtual(domain.domain()), nameScheme.getShortName(baseName) + ".java"); } - private FileUpdater startJavaFile(String packageName, String filename) { + public FileUpdater startJavaFile(@NotNull String packageName, @NotNull String filename) { FileUpdater fileUpdater = fileSet.createFileUpdater(packageName.replace('.', '/') + '/' + filename); fileUpdater.out.append("// Generated source").newLine().append("package ").append(packageName).semi().newLine().newLine(); return fileUpdater; diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/MyCreateStandaloneTypeBindingVisitorBase.java b/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/MyCreateStandaloneTypeBindingVisitorBase.java index 90b7068e8cb5..180a8fc28adb 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/MyCreateStandaloneTypeBindingVisitorBase.java +++ b/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/MyCreateStandaloneTypeBindingVisitorBase.java @@ -21,7 +21,7 @@ class MyCreateStandaloneTypeBindingVisitorBase extends CreateStandaloneTypeBindi return new StandaloneTypeBinding() { @Override public BoxableType getJavaType() { - return new StandaloneType(generator.generator.getNaming().additionalParam.getFullName(generator.domain.domain(), name), "writeMessage"); + return new StandaloneType(generator.generator.naming.additionalParam.getFullName(generator.domain.domain(), name), "writeMessage"); } @Override @@ -70,6 +70,6 @@ class MyCreateStandaloneTypeBindingVisitorBase extends CreateStandaloneTypeBindi } }).getType()); } - }, generator.generator.getNaming().outputTypedef, TypeData.Direction.OUTPUT); + }, generator.generator.naming.outputTypedef, TypeData.Direction.OUTPUT); } } diff --git a/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/OutputClassScope.java b/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/OutputClassScope.java index f88a55d7a039..76a309368f32 100644 --- a/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/OutputClassScope.java +++ b/platform/script-debugger/protocol/protocol-model-generator/src/org/jetbrains/protocolReader/OutputClassScope.java @@ -10,11 +10,11 @@ import java.util.ArrayList; import java.util.List; class OutputClassScope extends ClassScope { - OutputClassScope(DomainGenerator generator, NamePath classNamePath) { + OutputClassScope(@NotNull DomainGenerator generator, @NotNull NamePath classNamePath) { super(generator, classNamePath); } -

void generate(TextOutput out, List

parameters) { +

void generate(@NotNull TextOutput out, @Nullable List

parameters) { if (parameters == null) { return; } @@ -108,9 +108,9 @@ class OutputClassScope extends ClassScope { } } - private

void generateConstructor(@NotNull TextOutput out, @NotNull List

mandatoryParameters, @Nullable BoxableType[] mandatoryParameterTypes) { + private

void generateConstructor(@NotNull TextOutput out, @NotNull List

parameters, @Nullable BoxableType[] parameterTypes) { boolean hasDoc = false; - for (P parameter : mandatoryParameters) { + for (P parameter : parameters) { if (parameter.description() != null) { hasDoc = true; break; @@ -118,7 +118,7 @@ class OutputClassScope extends ClassScope { } if (hasDoc) { out.append("/**").newLine(); - for (P parameter : mandatoryParameters) { + for (P parameter : parameters) { if (parameter.description() != null) { out.append(" * @param " + parameter.name() + ' ' + parameter.description()).newLine(); } @@ -127,37 +127,50 @@ class OutputClassScope extends ClassScope { } out.append("public " + getShortClassName() + '('); - if (mandatoryParameterTypes == null) { - mandatoryParameterTypes = new BoxableType[mandatoryParameters.size()]; + if (parameterTypes == null) { + parameterTypes = new BoxableType[parameters.size()]; } - for (int i = 0, length = mandatoryParameterTypes.length; i < length; i++) { - assert mandatoryParameterTypes != null; - if (mandatoryParameterTypes[i] == null) { - P parameter = mandatoryParameters.get(i); - mandatoryParameterTypes[i] = new OutputMemberScope(parameter.name()).resolveType(parameter).getType(); + writeMethodParameters(out, parameters, parameterTypes); + out.append(')'); + + out.openBlock(false); + writeWriteCalls(out, parameters, parameterTypes, null); + out.closeBlock(); + } + +

void writeWriteCalls(@NotNull TextOutput out, @NotNull List

parameters, @NotNull BoxableType[] parameterTypes, @Nullable String qualifier) { + for (int i = 0, size = parameters.size(); i < size; i++) { + out.newLine(); + + if (qualifier != null) { + out.append(qualifier).append('.'); + } + + P parameter = parameters.get(i); + appendWriteValueInvocation(out, parameter, parameter.name(), parameterTypes[i]); + } + } + +

void writeMethodParameters(@NotNull TextOutput out, @NotNull List

parameters, @NotNull BoxableType[] parameterTypes) { + for (int i = 0, length = parameterTypes.length; i < length; i++) { + if (parameterTypes[i] == null) { + P parameter = parameters.get(i); + parameterTypes[i] = new OutputMemberScope(parameter.name()).resolveType(parameter).getType(); } } boolean needComa = false; - for (int i = 0, size = mandatoryParameters.size(); i < size; i++) { - P parameter = mandatoryParameters.get(i); + for (int i = 0, size = parameters.size(); i < size; i++) { if (needComa) { out.comma(); } + else { + needComa = true; + } - assert mandatoryParameterTypes != null; - out.append(mandatoryParameterTypes[i].getShortText(getClassContextNamespace())); - out.space().append(parameter.name()); - needComa = true; + out.append(parameterTypes[i].getShortText(getClassContextNamespace())); + out.space().append(parameters.get(i).name()); } - out.append(")").openBlock(false); - for (int i = 0, size = mandatoryParameters.size(); i < size; i++) { - P parameter = mandatoryParameters.get(i); - out.newLine(); - assert mandatoryParameterTypes != null; - appendWriteValueInvocation(out, parameter, parameter.name(), mandatoryParameterTypes[i]); - } - out.closeBlock(); } private void appendWriteValueInvocation(TextOutput out, ItemDescriptor.Named parameter, String valueRefName, @Nullable BoxableType type) { 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 5164b57a99f5..d61bed8df3b5 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 @@ -56,7 +56,7 @@ public abstract class OutMessage { } } - protected final void writeInt(String name, int value) { + public final void writeInt(String name, int value) { try { beginArguments(); writer.name(name).value(value); diff --git a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ExistingSubtypeAspect.java b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ExistingSubtypeAspect.java index 326d3f9a1c81..6d4bbfe2b828 100644 --- a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ExistingSubtypeAspect.java +++ b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ExistingSubtypeAspect.java @@ -1,5 +1,7 @@ package org.jetbrains.protocolReader; +import org.jetbrains.annotations.NotNull; + class ExistingSubtypeAspect { private SubtypeCaster subtypeCaster; private final TypeRef jsonSuperClass; @@ -12,34 +14,34 @@ class ExistingSubtypeAspect { this.subtypeCaster = subtypeCaster; } - void writeGetSuperMethodJava(TextOutput out) { + void writeGetSuperMethodJava(@NotNull TextOutput out) { out.newLine().append("@Override").newLine().append("public ").append(jsonSuperClass.get().getTypeClass().getCanonicalName() ).append(" getSuper()").openBlock(); out.append("return ").append(Util.BASE_VALUE_PREFIX).semi().closeBlock(); } - void writeSuperFieldJava(TextOutput out) { + void writeSuperFieldJava(@NotNull TextOutput out) { out.newLine().append("private final ").append(jsonSuperClass.get().getTypeClass().getCanonicalName()).append(' ').append(Util.BASE_VALUE_PREFIX).semi().newLine(); } - void writeSuperConstructorParamJava(TextOutput out) { + void writeSuperConstructorParamJava(@NotNull TextOutput out) { out.comma().append(jsonSuperClass.get().getTypeClass().getCanonicalName()).append(' ').append(Util.BASE_VALUE_PREFIX); } - void writeSuperConstructorInitialization(TextOutput out) { + void writeSuperConstructorInitialization(@NotNull TextOutput out) { out.append("this.").append(Util.BASE_VALUE_PREFIX).append(" = ").append(Util.BASE_VALUE_PREFIX).append(';').newLine().newLine(); } - void writeParseMethod(String className, ClassScope scope, TextOutput out) { - out.newLine().append("public static ").append(className).space().append("parse").append("(").append(Util.JSON_READER_PARAMETER_DEF).append(')').openBlock(); + void writeParseMethod(@NotNull String className, @NotNull ClassScope scope, @NotNull TextOutput out) { + out.newLine().append("public static ").append(className).space().append("parse").append('(').append(Util.JSON_READER_PARAMETER_DEF).append(", String name").append(')').openBlock(); out.append("return "); jsonSuperClass.get().writeInstantiateCode(scope, out); - out.append('(').append(Util.READER_NAME).append(')').append('.'); + out.append('(').append(Util.READER_NAME).append(", name)").append('.'); subtypeCaster.writeJava(out); out.semi().closeBlock(); out.newLine(); } - public void writeInstantiateCode(String className, TextOutput out) { + public void writeInstantiateCode(@NotNull String className, @NotNull TextOutput out) { out.append(className).append(".parse"); } } diff --git a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/FileUpdater.java b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/FileUpdater.java index c8fe89694952..9fcec08dd770 100644 --- a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/FileUpdater.java +++ b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/FileUpdater.java @@ -25,10 +25,14 @@ class FileUpdater { } void update() throws IOException { + if (builder.length() == 0) { + Files.delete(file); + return; + } + byte[] newContent = builder.toString().getBytes(StandardCharsets.UTF_8); if (Files.exists(file)) { - byte[] oldContent = Files.readAllBytes(file); - if (Arrays.equals(oldContent, newContent)) { + if (Arrays.equals(Files.readAllBytes(file), newContent)) { return; } }