Another fix for custom settings referencing original root when cloned + test

This commit is contained in:
Rustam Vishnyakov
2019-03-20 15:38:08 +03:00
parent 7ef37cdcd7
commit 7636e2bab2
3 changed files with 13 additions and 9 deletions
@@ -15,6 +15,7 @@
*/
package com.intellij.java.psi.codeStyle;
import com.intellij.application.options.CodeStyle;
import com.intellij.application.options.codeStyle.properties.AbstractCodeStylePropertyMapper;
import com.intellij.application.options.codeStyle.properties.CodeStylePropertyAccessor;
import com.intellij.ide.codeStyleSettings.CodeStyleTestCase;
@@ -58,8 +59,11 @@ public class JavaCodeStyleSettingsTest extends CodeStyleTestCase {
}
public void testSettingsCloneNotReferencingOriginal() throws IllegalAccessException {
JavaCodeStyleSettings original = JavaCodeStyleSettings.getInstance(getProject());
JavaCodeStyleSettings copy = (JavaCodeStyleSettings)original.clone();
CodeStyleSettings originalRoot = CodeStyle.getSettings(getProject());
JavaCodeStyleSettings original = originalRoot.getCustomSettings(JavaCodeStyleSettings.class);
CodeStyleSettings clonedRoot = originalRoot.clone();
JavaCodeStyleSettings copy = clonedRoot.getCustomSettings(JavaCodeStyleSettings.class);
assertSame(clonedRoot, copy.getContainer());
for (Field field : copy.getClass().getDeclaredFields()) {
if (!isPrimitiveOrString(field.getType()) && (field.getModifiers() & Modifier.PUBLIC) != 0) {
assertNotSame("Fields '" + field.getName() + "' reference the same value", field.get(original), field.get(copy));
@@ -170,9 +170,7 @@ public class CodeStyleSettings extends LegacyCodeStyleSettings implements Clonea
myCustomSettings.clear();
for (final CustomCodeStyleSettings settings : from.getCustomSettingsValues()) {
CustomCodeStyleSettings clone = (CustomCodeStyleSettings)settings.clone();
clone.setContainer(this);
addCustomSettings(clone);
addCustomSettings(settings.copyWith(this));
}
FIELD_TYPE_TO_NAME.copyFrom(from.FIELD_TYPE_TO_NAME);
@@ -43,10 +43,6 @@ public abstract class CustomCodeStyleSettings implements Cloneable {
return myContainer;
}
void setContainer(CodeStyleSettings container) {
myContainer = container;
}
@NonNls @NotNull
public final String getTagName() {
return myTagName;
@@ -75,6 +71,12 @@ public abstract class CustomCodeStyleSettings implements Cloneable {
}
}
CustomCodeStyleSettings copyWith(@NotNull CodeStyleSettings container) {
CustomCodeStyleSettings cloned = (CustomCodeStyleSettings)clone();
cloned.myContainer = container;
return cloned;
}
@Override
public Object clone() {
try {