package com.intellij.flex.model.bc.impl;
import com.intellij.flex.model.bc.CompilerOptionInfo;
import com.intellij.flex.model.bc.JpsFlexCompilerOptions;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.xmlb.annotations.MapAnnotation;
import com.intellij.util.xmlb.annotations.Property;
import com.intellij.util.xmlb.annotations.Tag;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.ex.JpsElementBase;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
public class JpsFlexCompilerOptionsImpl extends JpsElementBase<JpsFlexCompilerOptionsImpl> implements JpsFlexCompilerOptions {
private @NotNull final Map<String, String> myOptions = new THashMap<>();
private @NotNull ResourceFilesMode myResourceFilesMode = ResourceFilesMode.All;
private @NotNull String myFilesToIncludeInSWC = "";
private @NotNull String myAdditionalConfigFilePath = "";
private @NotNull String myAdditionalOptions = "";
JpsFlexCompilerOptionsImpl() {
}
private JpsFlexCompilerOptionsImpl(final JpsFlexCompilerOptionsImpl original) {
myOptions.clear();
myOptions.putAll(original.myOptions);
myResourceFilesMode = original.myResourceFilesMode;
myFilesToIncludeInSWC = original.myFilesToIncludeInSWC;
myAdditionalConfigFilePath = original.myAdditionalConfigFilePath;
myAdditionalOptions = original.myAdditionalOptions;
}
@NotNull
public JpsFlexCompilerOptionsImpl createCopy() {
return new JpsFlexCompilerOptionsImpl(this);
}
public void applyChanges(@NotNull final JpsFlexCompilerOptionsImpl modified) {
// todo use setters instead, because this method must throw events
myOptions.clear();
myOptions.putAll(modified.myOptions);
myResourceFilesMode = modified.myResourceFilesMode;
myFilesToIncludeInSWC = modified.myFilesToIncludeInSWC;
myAdditionalConfigFilePath = modified.myAdditionalConfigFilePath;
myAdditionalOptions = modified.myAdditionalOptions;
}
// ------------------------------------
@Nullable
public String getOption(@NotNull String name) {
return myOptions.get(name);
}
@NotNull
public Map<String, String> getAllOptions() {
return Collections.unmodifiableMap(myOptions);
}
@NotNull
public ResourceFilesMode getResourceFilesMode() {
return myResourceFilesMode;
}
public void setResourceFilesMode(@NotNull final ResourceFilesMode resourceFilesMode) {
myResourceFilesMode = resourceFilesMode;
}
@NotNull
public Collection<String> getFilesToIncludeInSWC() {
if (myFilesToIncludeInSWC.isEmpty()) return Collections.emptyList();
return StringUtil.split(myFilesToIncludeInSWC, CompilerOptionInfo.LIST_ENTRIES_SEPARATOR);
}
@NotNull
public String getAdditionalConfigFilePath() {
return myAdditionalConfigFilePath;
}
@NotNull
public String getAdditionalOptions() {
return myAdditionalOptions;
}
public void setAdditionalOptions(@NotNull final String additionalOptions) {
myAdditionalOptions = additionalOptions;
}
// ------------------------------------
public State getState(/*final @Nullable ComponentManager componentManager*/) {
State state = new State();
/*putOptionsCollapsingPaths(myOptions, state.options, componentManager);*/
for (Map.Entry<String, String> entry : myOptions.entrySet()) {
state.options.put(entry.getKey(), entry.getValue());
}
state.resourceFilesMode = myResourceFilesMode;
//state.filesToIncludeInSWC = FlexIdeBuildConfigurationImpl.collapsePaths(componentManager, myFilesToIncludeInSWC);
state.filesToIncludeInSWC = myFilesToIncludeInSWC;
state.additionalConfigFilePath = myAdditionalConfigFilePath;
state.additionalOptions = myAdditionalOptions;
return state;
}
public void loadState(State state) {
assert myOptions.isEmpty();
for (Map.Entry<String, String> entry : state.options.entrySet()) {
myOptions.put(entry.getKey(), entry.getValue());
}
// filter out options that are not known in current IDEA version
/*
for (Map.Entry<String, String> entry : state.options.entrySet()) {
if (CompilerOptionInfo.idExists(entry.getKey())) {
// no need in expanding paths, it is done automatically even if macros is not in the beginning of the string
myOptions.put(entry.getKey(), entry.getValue());
}
}
*/
myResourceFilesMode = state.resourceFilesMode;
myFilesToIncludeInSWC = state.filesToIncludeInSWC;
myAdditionalConfigFilePath = state.additionalConfigFilePath;
myAdditionalOptions = state.additionalOptions;
}
@Tag("compiler-options")
public static class State {
@Property(surroundWithTag = false)
@MapAnnotation(surroundKeyWithTag = false, surroundValueWithTag = false)
public Map<String, String> options = new THashMap<>();
public ResourceFilesMode resourceFilesMode = ResourceFilesMode.All;
public String filesToIncludeInSWC = "";
public String additionalConfigFilePath = "";
public String additionalOptions = "";
}
}