[Gradle] Annotation processing model serialization service IDEA-187868

GitOrigin-RevId: a51f01647dd321d75c6e4df46d51710ac006348e
This commit is contained in:
Vladislav.Soroka
2019-10-01 16:35:14 +00:00
committed by intellij-monorepo-bot
parent b15ec2af98
commit 906bed48fd
7 changed files with 175 additions and 19 deletions
@@ -167,6 +167,18 @@ public class ToolingStreamApiUtils {
return set;
}
public static List<String> readStringList(@NotNull IonReader reader) {
List<String> list = new ArrayList<String>();
reader.next();
reader.stepIn();
String nextString;
while ((nextString = readString(reader, null)) != null) {
list.add(nextString);
}
reader.stepOut();
return list;
}
public static void assertFieldName(@NotNull IonReader reader, @Nullable String fieldName) {
String readerFieldName = reader.getFieldName();
assert fieldName == null || fieldName.equals(readerFieldName) :
@@ -18,4 +18,5 @@ org.jetbrains.plugins.gradle.tooling.serialization.ExternalProjectSerializationS
org.jetbrains.plugins.gradle.tooling.serialization.BuildScriptClasspathModelSerializationService
org.jetbrains.plugins.gradle.tooling.serialization.RepositoriesModelSerializationService
org.jetbrains.plugins.gradle.tooling.serialization.GradleExtensionsSerializationService
org.jetbrains.plugins.gradle.tooling.serialization.ExternalTestsSerializationService
org.jetbrains.plugins.gradle.tooling.serialization.ExternalTestsSerializationService
org.jetbrains.plugins.gradle.tooling.serialization.AnnotationProcessingModelSerializationService
@@ -60,7 +60,11 @@ public class AnnotationProcessingModelBuilder extends AbstractModelBuilderServic
annotationProcessorArgs.add(arg);
}
}
sourceSetConfigs.put(sourceSet.getName(), new AnnotationProcessingConfigImpl(files, annotationProcessorArgs));
Set<String> paths = new LinkedHashSet<String>(files.size());
for (File file : files) {
paths.add(file.getAbsolutePath());
}
sourceSetConfigs.put(sourceSet.getName(), new AnnotationProcessingConfigImpl(paths, annotationProcessorArgs));
}
}
}
@@ -1,13 +1,12 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.plugins.gradle.tooling.internal;
import org.gradle.internal.impldep.com.google.common.base.Objects;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.gradle.model.AnnotationProcessingConfig;
import java.io.File;
import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@ -15,12 +14,8 @@ public class AnnotationProcessingConfigImpl implements AnnotationProcessingConfi
private final Set<String> myPaths;
private final List<String> myArgs;
public AnnotationProcessingConfigImpl(Set<File> files, List<String> args) {
Set<String> paths = new LinkedHashSet<String>(files.size());
for (File file : files) {
paths.add(file.getAbsolutePath());
}
myPaths = paths;
public AnnotationProcessingConfigImpl(Set<String> files, List<String> args) {
myPaths = files;
myArgs = args;
}
@@ -35,4 +30,18 @@ public class AnnotationProcessingConfigImpl implements AnnotationProcessingConfi
public Collection<String> getAnnotationProcessorArguments() {
return myArgs;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AnnotationProcessingConfigImpl config = (AnnotationProcessingConfigImpl)o;
return Objects.equal(myPaths, config.myPaths) &&
Objects.equal(myArgs, config.myArgs);
}
@Override
public int hashCode() {
return Objects.hashCode(myPaths, myArgs);
}
}
@@ -1,6 +1,7 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.plugins.gradle.tooling.internal;
import org.gradle.internal.impldep.com.google.common.base.Objects;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.gradle.model.AnnotationProcessingConfig;
@@ -27,4 +28,17 @@ public class AnnotationProcessingModelImpl implements AnnotationProcessingModel,
public AnnotationProcessingConfig bySourceSetName(@NotNull String sourceSetName) {
return configs.get(sourceSetName);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AnnotationProcessingModelImpl model = (AnnotationProcessingModelImpl)o;
return Objects.equal(configs, model.configs);
}
@Override
public int hashCode() {
return Objects.hashCode(configs);
}
}
@@ -2,13 +2,27 @@
package org.jetbrains.plugins.gradle.tooling.serialization;
import com.amazon.ion.IonReader;
import com.amazon.ion.IonType;
import com.amazon.ion.IonWriter;
import com.amazon.ion.system.IonBinaryWriterBuilder;
import com.amazon.ion.system.IonReaderBuilder;
import com.intellij.openapi.util.Getter;
import com.intellij.util.ThrowableConsumer;
import org.jetbrains.plugins.gradle.model.AnnotationProcessingConfig;
import org.jetbrains.plugins.gradle.model.AnnotationProcessingModel;
import org.jetbrains.plugins.gradle.tooling.internal.AnnotationProcessingConfigImpl;
import org.jetbrains.plugins.gradle.tooling.internal.AnnotationProcessingModelImpl;
import org.jetbrains.plugins.gradle.tooling.util.IntObjectMap;
import org.jetbrains.plugins.gradle.tooling.util.ObjectCollector;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.jetbrains.plugins.gradle.tooling.serialization.ToolingStreamApiUtils.*;
public class AnnotationProcessingModelSerializationService implements SerializationService<AnnotationProcessingModel> {
@@ -16,7 +30,8 @@ public class AnnotationProcessingModelSerializationService implements Serializat
private final ReadContext myReadContext = new ReadContext();
@Override
public byte[] write(AnnotationProcessingModel annotationProcessingModel, Class<? extends AnnotationProcessingModel> modelClazz) throws IOException {
public byte[] write(AnnotationProcessingModel annotationProcessingModel, Class<? extends AnnotationProcessingModel> modelClazz)
throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
IonWriter writer = IonBinaryWriterBuilder.standard().build(out);
try {
@@ -28,10 +43,6 @@ public class AnnotationProcessingModelSerializationService implements Serializat
return out.toByteArray();
}
private void write(IonWriter writer, WriteContext context, AnnotationProcessingModel model) {
}
@Override
public AnnotationProcessingModel read(byte[] object, Class<? extends AnnotationProcessingModel> modelClazz) throws IOException {
IonReader reader = IonReaderBuilder.standard().build(object);
@@ -43,8 +54,101 @@ public class AnnotationProcessingModelSerializationService implements Serializat
}
}
private AnnotationProcessingModel read(IonReader reader, ReadContext context) {
return null;
private static void write(final IonWriter writer, final WriteContext context, final AnnotationProcessingModel model) throws IOException {
context.objectCollector.add(model, new ObjectCollector.Processor<IOException>() {
@Override
public void process(boolean isAdded, int objectId) throws IOException {
writer.stepIn(IonType.STRUCT);
writer.setFieldName(OBJECT_ID_FIELD);
writer.writeInt(objectId);
if (isAdded) {
writeConfigs(writer, context, model.allConfigs());
}
writer.stepOut();
}
});
}
private static void writeConfigs(final IonWriter writer,
final WriteContext context,
Map<String, AnnotationProcessingConfig> configs) throws IOException {
writeMap(writer, "configs", configs, new ThrowableConsumer<String, IOException>() {
@Override
public void consume(String s) throws IOException {
writer.writeString(s);
}
}, new ThrowableConsumer<AnnotationProcessingConfig, IOException>() {
@Override
public void consume(AnnotationProcessingConfig config) throws IOException {
writeConfig(writer, context, config);
}
});
}
private static void writeConfig(final IonWriter writer,
final WriteContext context,
final AnnotationProcessingConfig config) throws IOException {
context.configCollector.add(config, new ObjectCollector.Processor<IOException>() {
@Override
public void process(boolean isAdded, int objectId) throws IOException {
writer.stepIn(IonType.STRUCT);
writer.setFieldName(OBJECT_ID_FIELD);
writer.writeInt(objectId);
if (isAdded) {
writeStrings(writer, "args", config.getAnnotationProcessorArguments());
writeStrings(writer, "paths", config.getAnnotationProcessorPath());
}
writer.stepOut();
}
});
}
private static AnnotationProcessingModel read(final IonReader reader, final ReadContext context) {
if (reader.next() == null) return null;
reader.stepIn();
AnnotationProcessingModelImpl model =
context.objectMap
.computeIfAbsent(readInt(reader, OBJECT_ID_FIELD), new IntObjectMap.SimpleObjectFactory<AnnotationProcessingModelImpl>() {
@Override
public AnnotationProcessingModelImpl create() {
Map<String, AnnotationProcessingConfig> configs = readConfigs(reader, context);
return new AnnotationProcessingModelImpl(configs);
}
});
reader.stepOut();
return model;
}
private static Map<String, AnnotationProcessingConfig> readConfigs(final IonReader reader, final ReadContext context) {
return readMap(reader, new Getter<String>() {
@Override
public String get() {
return readString(reader, null);
}
}, new Getter<AnnotationProcessingConfig>() {
@Override
public AnnotationProcessingConfig get() {
return readConfig(reader, context);
}
});
}
private static AnnotationProcessingConfig readConfig(final IonReader reader, final ReadContext context) {
reader.next();
reader.stepIn();
AnnotationProcessingConfigImpl config =
context.configMap
.computeIfAbsent(readInt(reader, OBJECT_ID_FIELD), new IntObjectMap.SimpleObjectFactory<AnnotationProcessingConfigImpl>() {
@Override
public AnnotationProcessingConfigImpl create() {
List<String> args = readStringList(reader);
Set<String> files = readStringSet(reader);
return new AnnotationProcessingConfigImpl(files, args);
}
});
reader.stepOut();
return config;
}
@Override
@@ -53,10 +157,15 @@ public class AnnotationProcessingModelSerializationService implements Serializat
}
private static class WriteContext {
private final ObjectCollector<AnnotationProcessingModel, IOException> objectCollector =
new ObjectCollector<AnnotationProcessingModel, IOException>();
private final ObjectCollector<AnnotationProcessingConfig, IOException> configCollector =
new ObjectCollector<AnnotationProcessingConfig, IOException>();
}
private static class ReadContext {
private final IntObjectMap<AnnotationProcessingModelImpl> objectMap = new IntObjectMap<AnnotationProcessingModelImpl>();
private final IntObjectMap<AnnotationProcessingConfigImpl> configMap = new IntObjectMap<AnnotationProcessingConfigImpl>();
}
}
@@ -13,6 +13,7 @@ import org.jetbrains.plugins.gradle.model.DefaultExternalProjectDependency
import org.jetbrains.plugins.gradle.model.DefaultGradleExtensions
import org.jetbrains.plugins.gradle.model.ExternalTask
import org.jetbrains.plugins.gradle.model.tests.DefaultExternalTestsModel
import org.jetbrains.plugins.gradle.tooling.internal.AnnotationProcessingModelImpl
import org.jetbrains.plugins.gradle.tooling.internal.BuildScriptClasspathModelImpl
import org.jetbrains.plugins.gradle.tooling.internal.RepositoriesModelImpl
import org.jetbrains.plugins.gradle.tooling.serialization.internal.IdeaProjectSerializationService
@@ -121,6 +122,12 @@ class ToolingSerializerTest {
}, serializer)
}
@Test
@Throws(Exception::class)
fun `annotation processing model serialization test`() {
doTest(AnnotationProcessingModelImpl::class.java)
}
@Throws(IOException::class)
private fun <T> doTest(modelClazz: Class<T>) {
doTest(modelClazz, null)
@@ -166,7 +173,7 @@ class ToolingSerializerTest {
}
else {
gradleProject.parent = parentGradleProject
gradleProject.setChildren(emptyList());
gradleProject.setChildren(emptyList())
}
}