cleanup, prepare to fix WEB-14597 Breakpoints being ignored if functions called from live console

This commit is contained in:
Vladimir Krivosheev
2015-01-07 18:27:05 +01:00
parent 5137f94c34
commit fb83d4983f
10 changed files with 184 additions and 100 deletions
@@ -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) {
@@ -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);
}
@@ -17,12 +17,12 @@ abstract class CreateStandaloneTypeBindingVisitorBase implements TypeVisitor<Sta
@Override
public StandaloneTypeBinding visitString() {
return generator.createTypedefTypeBinding(type, StandaloneTypeBinding.PredefinedTarget.STRING, generator.generator.getNaming().commonTypedef, null);
return generator.createTypedefTypeBinding(type, StandaloneTypeBinding.PredefinedTarget.STRING, generator.generator.naming.commonTypedef, null);
}
@Override
public StandaloneTypeBinding visitInteger() {
return generator.createTypedefTypeBinding(type, StandaloneTypeBinding.PredefinedTarget.INT, generator.generator.getNaming().commonTypedef, null);
return generator.createTypedefTypeBinding(type, StandaloneTypeBinding.PredefinedTarget.INT, generator.generator.naming.commonTypedef, null);
}
@Override
@@ -38,13 +38,13 @@ abstract class CreateStandaloneTypeBindingVisitorBase implements TypeVisitor<Sta
@Override
public StandaloneTypeBinding visitNumber() {
return generator.createTypedefTypeBinding(type, StandaloneTypeBinding.PredefinedTarget.NUMBER,
generator.generator.getNaming().commonTypedef, null);
generator.generator.naming.commonTypedef, null);
}
@Override
public StandaloneTypeBinding visitMap() {
return generator.createTypedefTypeBinding(type, StandaloneTypeBinding.PredefinedTarget.MAP,
generator.generator.getNaming().commonTypedef, null);
generator.generator.naming.commonTypedef, null);
}
@Override
@@ -6,7 +6,6 @@ import org.jetbrains.jsonProtocol.ItemDescriptor;
import org.jetbrains.jsonProtocol.ProtocolMetaModel;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
class DomainGenerator {
@@ -26,45 +25,113 @@ class DomainGenerator {
}
}
@NotNull
static String fixMethodName(@NotNull String name) {
int i = name.indexOf("breakpoint");
return i > 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<ProtocolMetaModel.Parameter> 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 <P extends ItemDescriptor.Named> void generateTopLevelOutputClass(ClassNameScheme nameScheme,
private <P extends ItemDescriptor.Named> void generateTopLevelOutputClass(@NotNull ClassNameScheme nameScheme,
String baseName,
String description,
TextOutConsumer baseType,
TextOutConsumer additionalMemberText,
@Nullable TextOutConsumer baseType,
@Nullable TextOutConsumer additionalMemberText,
List<P> 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 <P extends ItemDescriptor.Named> void generateOutputClass(TextOutput out,
private <P extends ItemDescriptor.Named> 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<ProtocolMetaModel.ObjectProperty> 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<TextOutput> deferredWriters = new ArrayList<>();
final BoxableType actualJavaType = target.resolve(new StandaloneTypeBinding.Target.ResolveContext() {
@Override
public BoxableType generateNestedObject(String shortName, String description, List<ProtocolMetaModel.ObjectProperty> 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);
}
@@ -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<ParserRootInterfaceItem> 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;
@@ -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);
}
}
@@ -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);
}
<P extends ItemDescriptor.Named> void generate(TextOutput out, List<P> parameters) {
<P extends ItemDescriptor.Named> void generate(@NotNull TextOutput out, @Nullable List<P> parameters) {
if (parameters == null) {
return;
}
@@ -108,9 +108,9 @@ class OutputClassScope extends ClassScope {
}
}
private <P extends ItemDescriptor.Named> void generateConstructor(@NotNull TextOutput out, @NotNull List<P> mandatoryParameters, @Nullable BoxableType[] mandatoryParameterTypes) {
private <P extends ItemDescriptor.Named> void generateConstructor(@NotNull TextOutput out, @NotNull List<P> 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();
}
<P extends ItemDescriptor.Named> void writeWriteCalls(@NotNull TextOutput out, @NotNull List<P> 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]);
}
}
<P extends ItemDescriptor.Named> void writeMethodParameters(@NotNull TextOutput out, @NotNull List<P> 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) {
@@ -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);
@@ -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");
}
}
@@ -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;
}
}