mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-05-06 05:10:22 +07:00
get rid of groovy duplication; treat same name fields/params in constructor generation (IDEA-148338)
This commit is contained in:
@@ -26,6 +26,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
public interface ConstructorBodyGenerator {
|
||||
LanguageExtension<ConstructorBodyGenerator> INSTANCE = new LanguageExtension<ConstructorBodyGenerator>("com.intellij.constructorBodyGenerator");
|
||||
|
||||
@Deprecated
|
||||
void generateFieldInitialization(@NotNull StringBuilder buffer, @NotNull PsiField[] fields, @NotNull PsiParameter[] parameters);
|
||||
|
||||
void generateSuperCallIfNeeded(@NotNull StringBuilder buffer, @NotNull PsiParameter[] parameters);
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright 2000-2015 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.
|
||||
*/
|
||||
package com.intellij.codeInsight.generation;
|
||||
|
||||
import com.intellij.psi.PsiField;
|
||||
import com.intellij.psi.PsiParameter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public abstract class ConstructorBodyGeneratorBase implements ConstructorBodyGenerator {
|
||||
public void generateFieldInitialization(@NotNull StringBuilder buffer,
|
||||
@NotNull PsiField[] fields,
|
||||
@NotNull PsiParameter[] parameters,
|
||||
@NotNull Collection<String> existingNames) {
|
||||
for (int i = 0, length = fields.length; i < length; i++) {
|
||||
String fieldName = fields[i].getName();
|
||||
String paramName = parameters[i].getName();
|
||||
if (existingNames.contains(fieldName)) {
|
||||
buffer.append("this.");
|
||||
}
|
||||
buffer.append(fieldName);
|
||||
buffer.append("=");
|
||||
buffer.append(paramName);
|
||||
appendSemicolon(buffer);
|
||||
buffer.append("\n");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateFieldInitialization(@NotNull StringBuilder buffer, @NotNull PsiField[] fields, @NotNull PsiParameter[] parameters) {}
|
||||
|
||||
protected void appendSemicolon(@NotNull StringBuilder buffer) {}
|
||||
|
||||
@Override
|
||||
public void generateSuperCallIfNeeded(@NotNull StringBuilder buffer, @NotNull PsiParameter[] parameters) {
|
||||
if (parameters.length > 0) {
|
||||
buffer.append("super(");
|
||||
for (int j = 0; j < parameters.length; j++) {
|
||||
PsiParameter param = parameters[j];
|
||||
buffer.append(param.getName());
|
||||
if (j < parameters.length - 1) buffer.append(",");
|
||||
}
|
||||
buffer.append(")");
|
||||
appendSemicolon(buffer);
|
||||
buffer.append("\n");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public StringBuilder start(StringBuilder buffer, @NotNull String name, @NotNull PsiParameter[] parameters) {
|
||||
buffer.append("public ").append(name).append("(");
|
||||
for (PsiParameter parameter : parameters) {
|
||||
buffer.append(parameter.getType().getPresentableText()).append(' ').append(parameter.getName()).append(',');
|
||||
}
|
||||
if (parameters.length > 0) {
|
||||
buffer.delete(buffer.length() - 1, buffer.length());
|
||||
}
|
||||
buffer.append("){\n");
|
||||
return buffer;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright 2000-2015 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.
|
||||
*/
|
||||
package com.intellij.codeInsight.generation;
|
||||
|
||||
import com.intellij.psi.PsiField;
|
||||
import com.intellij.psi.PsiParameter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public interface ConstructorBodyGeneratorEx {
|
||||
void generateFieldInitialization(@NotNull StringBuilder buffer,
|
||||
@NotNull PsiField[] fields,
|
||||
@NotNull PsiParameter[] parameters,
|
||||
@NotNull Collection<String> existingNames);
|
||||
}
|
||||
@@ -298,7 +298,19 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase {
|
||||
if (isNotEnum) {
|
||||
generator.generateSuperCallIfNeeded(buffer, baseConstructor.getParameterList().getParameters());
|
||||
}
|
||||
generator.generateFieldInitialization(buffer, fields, fieldParams.toArray(new PsiParameter[fieldParams.size()]));
|
||||
final PsiParameter[] parameters = fieldParams.toArray(new PsiParameter[fieldParams.size()]);
|
||||
final List<String> existingNames = ContainerUtil.map(dummyConstructor.getParameterList().getParameters(), new Function<PsiParameter, String>() {
|
||||
@Override
|
||||
public String fun(PsiParameter parameter) {
|
||||
return parameter.getName();
|
||||
}
|
||||
});
|
||||
if (generator instanceof ConstructorBodyGeneratorEx) {
|
||||
((ConstructorBodyGeneratorEx)generator).generateFieldInitialization(buffer, fields, parameters, existingNames);
|
||||
}
|
||||
else {
|
||||
generator.generateFieldInitialization(buffer, fields, parameters);
|
||||
}
|
||||
generator.finish(buffer);
|
||||
PsiMethod stub = factory.createMethodFromText(buffer.toString(), aClass);
|
||||
PsiCodeBlock original = constructor.getBody(), replacement = stub.getBody();
|
||||
|
||||
@@ -15,55 +15,12 @@
|
||||
*/
|
||||
package com.intellij.codeInsight.generation;
|
||||
|
||||
import com.intellij.psi.PsiField;
|
||||
import com.intellij.psi.PsiParameter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* @author Max Medvedev
|
||||
*/
|
||||
public class JavaConstructorBodyWithSuperCallGenerator implements ConstructorBodyGenerator {
|
||||
public class JavaConstructorBodyWithSuperCallGenerator extends ConstructorBodyGeneratorBase {
|
||||
@Override
|
||||
public void generateFieldInitialization(@NotNull StringBuilder buffer,
|
||||
@NotNull PsiField[] fields,
|
||||
@NotNull PsiParameter[] parameters) {
|
||||
for (int i = 0, length = fields.length; i < length; i++) {
|
||||
String fieldName = fields[i].getName();
|
||||
String paramName = parameters[i].getName();
|
||||
if (fieldName.equals(paramName)) {
|
||||
buffer.append("this.");
|
||||
}
|
||||
buffer.append(fieldName);
|
||||
buffer.append("=");
|
||||
buffer.append(paramName);
|
||||
buffer.append(";\n");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateSuperCallIfNeeded(@NotNull StringBuilder buffer, @NotNull PsiParameter[] parameters) {
|
||||
if (parameters.length > 0) {
|
||||
buffer.append("super(");
|
||||
for (int j = 0; j < parameters.length; j++) {
|
||||
PsiParameter param = parameters[j];
|
||||
buffer.append(param.getName());
|
||||
if (j < parameters.length - 1) buffer.append(",");
|
||||
}
|
||||
buffer.append(");\n");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public StringBuilder start(StringBuilder buffer, @NotNull String name, @NotNull PsiParameter[] parameters) {
|
||||
buffer.append("public ").append(name).append("(");
|
||||
for (PsiParameter parameter : parameters) {
|
||||
buffer.append(parameter.getType().getPresentableText()).append(' ').append(parameter.getName()).append(',');
|
||||
}
|
||||
if (parameters.length > 0) {
|
||||
buffer.delete(buffer.length() - 1, buffer.length());
|
||||
}
|
||||
buffer.append("){\n");
|
||||
return buffer;
|
||||
protected void appendSemicolon(@NotNull StringBuilder buffer) {
|
||||
buffer.append(";");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Copyright 2000-2015 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.
|
||||
*/
|
||||
package com.intellij.codeInsight.generation;
|
||||
|
||||
public class NewJavaConstructorBodyWithSuperCallGenerator extends JavaConstructorBodyWithSuperCallGenerator implements ConstructorBodyGeneratorEx{
|
||||
}
|
||||
@@ -3,7 +3,7 @@ public class Clas extends Clas2{
|
||||
|
||||
public Clas(int foo, int foo1) {<caret>
|
||||
super(foo);
|
||||
foo = foo1;
|
||||
this.foo = foo1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,58 +15,12 @@
|
||||
*/
|
||||
package org.jetbrains.plugins.groovy.annotator.intentions.dynamic;
|
||||
|
||||
import com.intellij.codeInsight.generation.ConstructorBodyGenerator;
|
||||
import com.intellij.psi.PsiField;
|
||||
import com.intellij.psi.PsiParameter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import com.intellij.codeInsight.generation.ConstructorBodyGeneratorBase;
|
||||
import com.intellij.codeInsight.generation.ConstructorBodyGeneratorEx;
|
||||
|
||||
/**
|
||||
* @author Max Medvedev
|
||||
*/
|
||||
public class GrConstructorBodyGenerator implements ConstructorBodyGenerator {
|
||||
@Override
|
||||
public void generateFieldInitialization(@NotNull StringBuilder buffer,
|
||||
@NotNull PsiField[] fields,
|
||||
@NotNull PsiParameter[] parameters) {
|
||||
for (int i = 0, length = fields.length; i < length; i++) {
|
||||
String fieldName = fields[i].getName();
|
||||
String paramName = parameters[i].getName();
|
||||
if (fieldName.equals(paramName)) {
|
||||
buffer.append("this.");
|
||||
}
|
||||
buffer.append(fieldName);
|
||||
buffer.append("=");
|
||||
buffer.append(paramName);
|
||||
buffer.append("\n");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateSuperCallIfNeeded(@NotNull StringBuilder buffer, @NotNull PsiParameter[] parameters) {
|
||||
if (parameters.length > 0) {
|
||||
buffer.append("super(");
|
||||
for (int j = 0; j < parameters.length; j++) {
|
||||
PsiParameter param = parameters[j];
|
||||
buffer.append(param.getName());
|
||||
if (j < parameters.length - 1) buffer.append(",");
|
||||
}
|
||||
buffer.append(")\n");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public StringBuilder start(StringBuilder buffer, @NotNull String name, @NotNull PsiParameter[] parameters) {
|
||||
buffer.append("public ").append(name).append("(");
|
||||
for (PsiParameter parameter : parameters) {
|
||||
buffer.append(parameter.getType().getPresentableText()).append(' ').append(parameter.getName()).append(',');
|
||||
}
|
||||
if (parameters.length > 0) {
|
||||
buffer.delete(buffer.length() - 1, buffer.length());
|
||||
}
|
||||
buffer.append("){\n");
|
||||
return buffer;
|
||||
}
|
||||
|
||||
public class GrConstructorBodyGenerator extends ConstructorBodyGeneratorBase implements ConstructorBodyGeneratorEx{
|
||||
|
||||
@Override
|
||||
public void finish(StringBuilder buffer) {
|
||||
buffer.append('}');
|
||||
|
||||
@@ -1159,7 +1159,7 @@
|
||||
|
||||
<debuggerEditorTextProvider language="JAVA" implementationClass="com.intellij.debugger.impl.JavaEditorTextProviderImpl"/>
|
||||
|
||||
<constructorBodyGenerator language="JAVA" implementationClass="com.intellij.codeInsight.generation.JavaConstructorBodyWithSuperCallGenerator"/>
|
||||
<constructorBodyGenerator language="JAVA" implementationClass="com.intellij.codeInsight.generation.NewJavaConstructorBodyWithSuperCallGenerator"/>
|
||||
|
||||
<quoteHandler fileType="JAVA" className="com.intellij.codeInsight.editorActions.JavaQuoteHandler"/>
|
||||
<typedHandler implementation="com.intellij.codeInsight.editorActions.JavaTypedHandler" id="java"/>
|
||||
|
||||
Reference in New Issue
Block a user