From 59a76688bae8cb7c290be75bf1d0ac65687d9397 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 6 Oct 2017 09:48:01 +0200 Subject: [PATCH] SSR: keep unmatched variable initializer --- .../structuralsearch/JavaReplaceHandler.java | 27 +++++++++---------- .../StructuralReplaceTest.java | 13 +++++++++ 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaReplaceHandler.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaReplaceHandler.java index e2cba6934551..91201ec8defd 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaReplaceHandler.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaReplaceHandler.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2017 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 com.intellij.structuralsearch; import com.intellij.openapi.util.text.StringUtil; @@ -199,6 +185,17 @@ public class JavaReplaceHandler extends StructuralReplaceHandler { copyMethodBodyIfNotReplaced((PsiMethod)originalNamedElement, (PsiMethod)patternNamedElement, (PsiMethod)replacementNamedElement); } + if (originalNamedElement instanceof PsiVariable && + patternNamedElement instanceof PsiVariable && + replacementNamedElement instanceof PsiVariable) { + final PsiVariable originalVariable = (PsiVariable)originalNamedElement; + final PsiVariable queryVariable = (PsiVariable)patternNamedElement; + final PsiVariable replacementVariable = (PsiVariable)replacementNamedElement; + if (originalVariable.hasInitializer() && !queryVariable.hasInitializer() && !replacementVariable.hasInitializer()) { + replacementVariable.setInitializer(originalVariable.getInitializer()); + } + } + if (originalNamedElement instanceof PsiClass && patternNamedElement instanceof PsiClass && replacementNamedElement instanceof PsiClass) { diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java index 7d9ed351b591..e86bd5ce515a 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java @@ -2269,4 +2269,17 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase { "}", replacer.testReplace(in, what, by, options, true)); } + + public void testReplaceVariableInitializer() { + String in = "class X {" + + " private final int i = 1;" + + "}"; + String what = "int '_v;"; + String by = "long $v$;"; + assertEquals("initializer should remain", + "class X {" + + " private final long i=1;" + + "}", + replacer.testReplace(in, what, by, options, true)); + } } \ No newline at end of file