package com.siberika.idea.pascal.jps.model;
import com.siberika.idea.pascal.jps.sdk.PascalSdkData;
import com.siberika.idea.pascal.jps.util.ParamMap;
import org.jdom.Attribute;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.JpsElementFactory;
import org.jetbrains.jps.model.JpsSimpleElement;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension;
import org.jetbrains.jps.model.serialization.library.JpsSdkPropertiesSerializer;
import org.jetbrains.jps.model.serialization.module.JpsModulePropertiesSerializer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class JpsPascalModelSerializerExtension extends JpsModelSerializerExtension {
public static final String FPC_SDK_TYPE_ID = "FPCSdkType";
public static final String DELPHI_SDK_TYPE_ID = "DelphiSdkType";
@NotNull
@Override
public List<? extends JpsModulePropertiesSerializer<?>> getModulePropertiesSerializers() {
return Collections.singletonList(new JpsModulePropertiesSerializer<JpsSimpleElement<ParamMap>>(JpsPascalModuleType.INSTANCE, "PASCAL_MODULE", null) {
@Override
public JpsSimpleElement<ParamMap> loadProperties(@Nullable Element componentElement) {
return JpsElementFactory.getInstance().createSimpleElement(new ParamMap());
}
@Override
public void saveProperties(@NotNull JpsSimpleElement<ParamMap> properties, @NotNull Element componentElement) {
}
});
}
@NotNull
@Override
public List<? extends JpsSdkPropertiesSerializer<?>> getSdkPropertiesSerializers() {
List<JpsSdkPropertiesSerializer<JpsSimpleElement<ParamMap>>> result = new ArrayList<JpsSdkPropertiesSerializer<JpsSimpleElement<ParamMap>>>(2);
result.add(new JpsPascalSdkPropertiesSerializer<JpsSimpleElement<ParamMap>>(FPC_SDK_TYPE_ID, JpsPascalSdkType.INSTANCE));
result.add(new JpsPascalSdkPropertiesSerializer<JpsSimpleElement<ParamMap>>(DELPHI_SDK_TYPE_ID, JpsPascalSdkType.INSTANCE));
return result;
}
@Override
public void loadModuleOptions(@NotNull JpsModule module, @NotNull Element rootElement) {
super.loadModuleOptions(module, rootElement);
for (Attribute attribute : rootElement.getAttributes()) {
ParamMap.addJpsParam(module.getProperties(), attribute.getName(), attribute.getValue());
}
}
private static class JpsPascalSdkPropertiesSerializer<T> extends JpsSdkPropertiesSerializer<JpsSimpleElement<ParamMap>> {
public JpsPascalSdkPropertiesSerializer(String typeId, JpsPascalSdkType type) {
super(typeId, type);
}
@NotNull
@Override
public JpsSimpleElement<ParamMap> loadProperties(@Nullable Element propertiesElement) {
return JpsElementFactory.getInstance().createSimpleElement(new ParamMap()
.addPair(PascalSdkData.Keys.COMPILER_COMMAND.getKey(),
propertiesElement != null ? propertiesElement.getAttributeValue(PascalSdkData.Keys.COMPILER_COMMAND.getKey()) : "")
.addPair(PascalSdkData.Keys.COMPILER_OPTIONS.getKey(),
propertiesElement != null ? propertiesElement.getAttributeValue(PascalSdkData.Keys.COMPILER_OPTIONS.getKey()) : "")
.addPair(PascalSdkData.Keys.COMPILER_FAMILY.getKey(),
propertiesElement != null ? propertiesElement.getAttributeValue(PascalSdkData.Keys.COMPILER_FAMILY.getKey()) : "")
);
}
@Override
public void saveProperties(@NotNull JpsSimpleElement<ParamMap> properties, @NotNull Element element) {
}
}
}