mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-170948 Support @Builder includeSuperProperties
This commit is contained in:
@@ -379,6 +379,7 @@ assign.expected='=' expected
|
||||
declared.type.0.have.to.extend.script=Declared type ''{0}'' does not extend ''groovy.lang.Script'' class
|
||||
base.script.annotation.is.allowed.only.inside.scripts=Annotation @BaseScript can only be used within a script
|
||||
delegate.annotation.is.only.for.methods.without.arguments=Annotation @Delegate couldn't be applied to method with arguments
|
||||
builder.annotation.not.support.super.for.simple.strategy=Annotation attribute 'includeSuperProperties' not supported by groovy.transform.builder.SimpleStrategy
|
||||
0.expressions.on.trait.fields.properties.are.not.supported.in.traits={0} expressions on trait fields/properties are not supported in traits
|
||||
only.traits.expected.here=Only traits are expected here
|
||||
anonymous.classes.cannot.be.created.from.traits=Anonymous classes cannot be created from traits
|
||||
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
package org.jetbrains.plugins.groovy.annotator.checkers;
|
||||
|
||||
import com.intellij.lang.annotation.AnnotationHolder;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.plugins.groovy.GroovyBundle;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation;
|
||||
import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.BuilderAnnotationContributor;
|
||||
import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy.SimpleBuilderStrategySupport;
|
||||
|
||||
/**
|
||||
* Annotation attribute 'includeSuperProperties' not supported by groovy.transform.builder.SimpleStrategy
|
||||
*/
|
||||
public class BuilderAnnotationChecker extends CustomAnnotationChecker {
|
||||
@Override
|
||||
public boolean checkApplicability(@NotNull AnnotationHolder holder, @NotNull GrAnnotation annotation) {
|
||||
if (!BuilderAnnotationContributor.BUILDER_FQN.equals(annotation.getQualifiedName())) return false;
|
||||
|
||||
if(BuilderAnnotationContributor.isApplicable(annotation, SimpleBuilderStrategySupport.SIMPLE_STRATEGY_NAME) &&
|
||||
BuilderAnnotationContributor.isIncludeSuperProperties(annotation)) {
|
||||
holder.createErrorAnnotation(annotation, GroovyBundle.message("builder.annotation.not.support.super.for.simple.strategy"));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+6
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* 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.
|
||||
@@ -558,7 +558,11 @@ public class GrClassImplUtil {
|
||||
}
|
||||
|
||||
public static PsiField[] getAllFields(GrTypeDefinition grType) {
|
||||
Map<String, CandidateInfo> fieldsMap = CollectClassMembersUtil.getAllFields(grType);
|
||||
return getAllFields(grType, true);
|
||||
}
|
||||
|
||||
public static PsiField[] getAllFields(GrTypeDefinition grType, boolean includeSynthetic) {
|
||||
Map<String, CandidateInfo> fieldsMap = CollectClassMembersUtil.getAllFields(grType, includeSynthetic);
|
||||
return ContainerUtil.map2Array(fieldsMap.values(), PsiField.class, entry -> (PsiField)entry.getElement());
|
||||
}
|
||||
|
||||
|
||||
+27
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* 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.
|
||||
@@ -18,12 +18,20 @@ package org.jetbrains.plugins.groovy.lang.resolve.ast.builder;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.PsiAnnotation;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiField;
|
||||
import com.intellij.psi.PsiModifier;
|
||||
import org.jetbrains.annotations.Contract;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.impl.GrAnnotationUtil;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.util.GrClassImplUtil;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
|
||||
import org.jetbrains.plugins.groovy.transformations.AstTransformationSupport;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
public abstract class BuilderAnnotationContributor implements AstTransformationSupport {
|
||||
|
||||
public static final String BUILDER_PACKAGE = "groovy.transform.builder";
|
||||
@@ -38,4 +46,22 @@ public abstract class BuilderAnnotationContributor implements AstTransformationS
|
||||
if (aClass == null) return false;
|
||||
return StringUtil.getQualifiedName(BUILDER_PACKAGE, strategy).equals(aClass.getQualifiedName());
|
||||
}
|
||||
|
||||
public static PsiField[] getFields(@NotNull GrTypeDefinition clazz, @NotNull PsiAnnotation annotation) {
|
||||
Collection<? extends PsiField> collectedFields;
|
||||
if (isIncludeSuperProperties(annotation) ) {
|
||||
collectedFields = Arrays.asList(GrClassImplUtil.getAllFields(clazz, false));
|
||||
} else {
|
||||
collectedFields = Arrays.asList(clazz.getCodeFields());
|
||||
}
|
||||
|
||||
return collectedFields.stream()
|
||||
.filter(field -> field.getName() != null)
|
||||
.filter(field -> !field.hasModifierProperty(PsiModifier.STATIC))
|
||||
.toArray(PsiField[]::new);
|
||||
}
|
||||
|
||||
public static boolean isIncludeSuperProperties(@NotNull PsiAnnotation annotation) {
|
||||
return PsiUtil.getAnnoAttributeValue(annotation, "includeSuperProperties", false);
|
||||
}
|
||||
}
|
||||
|
||||
+10
-8
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* 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.
|
||||
@@ -22,7 +22,6 @@ import com.intellij.psi.impl.light.LightMethodBuilder;
|
||||
import com.intellij.psi.impl.light.LightPsiClassBuilder;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
|
||||
@@ -30,6 +29,8 @@ import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.BuilderAnnotationCo
|
||||
import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.BuilderHelperLightPsiClass;
|
||||
import org.jetbrains.plugins.groovy.transformations.TransformationContext;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import static org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil.createType;
|
||||
|
||||
public class DefaultBuilderStrategySupport extends BuilderAnnotationContributor {
|
||||
@@ -59,25 +60,25 @@ public class DefaultBuilderStrategySupport extends BuilderAnnotationContributor
|
||||
private void processTypeDefinition() {
|
||||
final PsiAnnotation builderAnno = PsiImplUtil.getAnnotation(myContainingClass, BUILDER_FQN);
|
||||
if (!isApplicable(builderAnno, DEFAULT_STRATEGY_NAME)) return;
|
||||
final PsiClass builderClass = createBuilderClass(builderAnno, myContext.getCodeClass().getCodeFields());
|
||||
final PsiClass builderClass = createBuilderClass(builderAnno, getFields(myContext.getCodeClass(), builderAnno));
|
||||
myContext.addMethod(createBuilderMethod(builderClass, builderAnno));
|
||||
myContext.addInnerClass(builderClass);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private LightPsiClassBuilder createBuilderClass(@NotNull final PsiAnnotation annotation, @NotNull GrVariable[] setters) {
|
||||
private LightPsiClassBuilder createBuilderClass(@NotNull final PsiAnnotation annotation, @NotNull PsiVariable[] setters) {
|
||||
return createBuilderClass(annotation, setters, null);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private LightPsiClassBuilder createBuilderClass(@NotNull final PsiAnnotation annotation,
|
||||
@NotNull GrVariable[] setters,
|
||||
@NotNull PsiVariable[] setters,
|
||||
@Nullable PsiType builtType) {
|
||||
final LightPsiClassBuilder builderClass = new BuilderHelperLightPsiClass(
|
||||
myContainingClass, getBuilderClassName(annotation, myContainingClass)
|
||||
);
|
||||
|
||||
for (GrVariable field : setters) {
|
||||
for (PsiVariable field : setters) {
|
||||
builderClass.addMethod(createFieldSetter(builderClass, field, annotation));
|
||||
}
|
||||
|
||||
@@ -149,9 +150,10 @@ public class DefaultBuilderStrategySupport extends BuilderAnnotationContributor
|
||||
|
||||
@NotNull
|
||||
public static LightMethodBuilder createFieldSetter(@NotNull PsiClass builderClass,
|
||||
@NotNull GrVariable field,
|
||||
@NotNull PsiVariable field,
|
||||
@NotNull PsiAnnotation annotation) {
|
||||
return createFieldSetter(builderClass, field.getName(), field.getType(), annotation, field);
|
||||
String name = Objects.requireNonNull(field.getName());
|
||||
return createFieldSetter(builderClass, name, field.getType(), annotation, field);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
+10
-10
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* 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.
|
||||
@@ -15,21 +15,19 @@
|
||||
*/
|
||||
package org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy;
|
||||
|
||||
import com.intellij.psi.PsiAnnotation;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.psi.PsiType;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.light.LightMethodBuilder;
|
||||
import com.intellij.psi.util.PropertyUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.impl.GrAnnotationUtil;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
|
||||
import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.BuilderAnnotationContributor;
|
||||
import org.jetbrains.plugins.groovy.transformations.TransformationContext;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import static org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil.createType;
|
||||
import static org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy.DefaultBuilderStrategySupport.createBuildMethod;
|
||||
|
||||
@@ -46,12 +44,14 @@ public class ExternalBuilderStrategySupport extends BuilderAnnotationContributor
|
||||
if (constructedClass == null || "groovy.transform.Undefined.CLASS".equals(constructedClass.getQualifiedName())) return;
|
||||
|
||||
if (constructedClass instanceof GrTypeDefinition) {
|
||||
for (GrField field : ((GrTypeDefinition)constructedClass).getCodeFields()) {
|
||||
PsiField[] fields = getFields((GrTypeDefinition)constructedClass, annotation);
|
||||
for (PsiField field : fields) {
|
||||
context.addMethod(DefaultBuilderStrategySupport.createFieldSetter(context.getCodeClass(), field, annotation));
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (PsiMethod setter : PropertyUtil.getAllProperties(constructedClass, true, false).values()) {
|
||||
} else {
|
||||
boolean superProperties = isIncludeSuperProperties(annotation);
|
||||
Collection<PsiMethod> properties = PropertyUtil.getAllProperties(constructedClass, true, false, superProperties).values();
|
||||
for (PsiMethod setter : properties) {
|
||||
final PsiMethod builderSetter = createFieldSetter(context.getCodeClass(), setter, annotation);
|
||||
if (builderSetter != null) context.addMethod(builderSetter);
|
||||
}
|
||||
|
||||
+7
-6
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* 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.
|
||||
@@ -22,7 +22,6 @@ import com.intellij.psi.impl.light.LightMethodBuilder;
|
||||
import com.intellij.psi.impl.light.LightPsiClassBuilder;
|
||||
import com.intellij.psi.impl.light.LightTypeParameterBuilder;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
|
||||
@@ -30,6 +29,8 @@ import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.BuilderAnnotationCo
|
||||
import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.BuilderHelperLightPsiClass;
|
||||
import org.jetbrains.plugins.groovy.transformations.TransformationContext;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import static org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy.DefaultBuilderStrategySupport.getBuilderClassName;
|
||||
import static org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy.DefaultBuilderStrategySupport.getFieldMethodName;
|
||||
|
||||
@@ -65,7 +66,7 @@ public class InitializerBuilderStrategySupport extends BuilderAnnotationContribu
|
||||
final PsiAnnotation builderAnno = PsiImplUtil.getAnnotation(myContainingClass, BUILDER_FQN);
|
||||
if (!isApplicable(builderAnno, INITIALIZER_STRATEGY_NAME)) return;
|
||||
|
||||
final PsiClass builderClass = createBuilderClass(builderAnno, myContainingClass.getCodeFields());
|
||||
final PsiClass builderClass = createBuilderClass(builderAnno, getFields(myContext.getCodeClass(), builderAnno));
|
||||
myContext.addMethod(createBuilderMethod(builderClass, builderAnno));
|
||||
myContext.addMethod(createBuilderConstructor(myContainingClass, builderClass, builderAnno));
|
||||
myContext.addInnerClass(builderClass);
|
||||
@@ -73,7 +74,7 @@ public class InitializerBuilderStrategySupport extends BuilderAnnotationContribu
|
||||
|
||||
@NotNull
|
||||
private LightPsiClassBuilder createBuilderClass(@NotNull final PsiAnnotation annotation,
|
||||
@NotNull GrVariable[] setters) {
|
||||
@NotNull PsiVariable[] setters) {
|
||||
final LightPsiClassBuilder builderClass = new BuilderHelperLightPsiClass(
|
||||
myContainingClass, getBuilderClassName(annotation, myContainingClass)
|
||||
);
|
||||
@@ -88,10 +89,10 @@ public class InitializerBuilderStrategySupport extends BuilderAnnotationContribu
|
||||
|
||||
@NotNull
|
||||
private LightMethodBuilder createFieldSetter(@NotNull LightPsiClassBuilder builderClass,
|
||||
@NotNull GrVariable field,
|
||||
@NotNull PsiVariable field,
|
||||
@NotNull PsiAnnotation annotation,
|
||||
int currentField) {
|
||||
final String name = field.getName();
|
||||
final String name = Objects.requireNonNull(field.getName());
|
||||
final LightMethodBuilder fieldSetter = new LightMethodBuilder(builderClass.getManager(), getFieldMethodName(annotation, name));
|
||||
final PsiSubstitutor substitutor = PsiSubstitutor.EMPTY.put(
|
||||
builderClass.getTypeParameters()[currentField],
|
||||
|
||||
+2
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* 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.
|
||||
@@ -40,6 +40,7 @@ public class SimpleBuilderStrategySupport extends BuilderAnnotationContributor {
|
||||
GrTypeDefinition typeDefinition = context.getCodeClass();
|
||||
final PsiAnnotation annotation = PsiImplUtil.getAnnotation(typeDefinition, BUILDER_FQN);
|
||||
if (!isApplicable(annotation, SIMPLE_STRATEGY_NAME)) return;
|
||||
if (isIncludeSuperProperties(annotation)) return;
|
||||
for (GrField field : typeDefinition.getCodeFields()) {
|
||||
context.addMethod(createFieldSetter(typeDefinition, field, annotation));
|
||||
}
|
||||
|
||||
@@ -252,6 +252,7 @@
|
||||
<customAnnotationChecker implementation="org.jetbrains.plugins.groovy.annotator.checkers.AnnotationCollectorChecker" order="first"/>
|
||||
<customAnnotationChecker implementation="org.jetbrains.plugins.groovy.annotator.checkers.DelegatesToAnnotationChecker"/>
|
||||
<customAnnotationChecker implementation="org.jetbrains.plugins.groovy.annotator.checkers.DelegateAnnotationChecker"/>
|
||||
<customAnnotationChecker implementation="org.jetbrains.plugins.groovy.annotator.checkers.BuilderAnnotationChecker"/>
|
||||
<customAnnotationChecker implementation="org.jetbrains.plugins.groovy.griffon.GriffonPropertyListenerAnnotationChecker"/>
|
||||
<customAnnotationChecker implementation="org.jetbrains.plugins.groovy.annotator.checkers.BaseScriptAnnotationChecker"/>
|
||||
|
||||
|
||||
+56
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
* 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.
|
||||
@@ -16,6 +16,7 @@
|
||||
package org.jetbrains.plugins.groovy.completion.builder
|
||||
|
||||
import groovy.transform.CompileStatic
|
||||
import org.jetbrains.plugins.groovy.completion.CompletionResult
|
||||
|
||||
@CompileStatic
|
||||
class GrDefaultBuilderStrategyTest extends GrBuilderTransformationCompletionTestBase {
|
||||
@@ -302,4 +303,58 @@ class Pojo {
|
||||
Pojo.builder().counter(1).name("Janet").<caret>
|
||||
''', 'build', 'name', 'dynamic', 'counter')
|
||||
}
|
||||
|
||||
void 'test include super properties'() {
|
||||
doVariantableTest '''
|
||||
import groovy.transform.builder.Builder
|
||||
class Animal {
|
||||
String color
|
||||
int legs
|
||||
}
|
||||
|
||||
@Builder(includeSuperProperties = true)
|
||||
class Pet extends Animal{
|
||||
String name
|
||||
}
|
||||
|
||||
new Pet().builder().color("Grey").<caret>
|
||||
''', 'legs', 'name'
|
||||
}
|
||||
|
||||
void 'test include super properties 2'() {
|
||||
doVariantableTest '''
|
||||
import groovy.transform.builder.Builder
|
||||
class Animal {
|
||||
String color
|
||||
int legs
|
||||
}
|
||||
|
||||
@Builder(includeSuperProperties = true)
|
||||
class Pet extends Animal{
|
||||
String name
|
||||
}
|
||||
|
||||
new Pet().builder().name("Janet").<caret>
|
||||
''', 'color', 'legs'
|
||||
}
|
||||
|
||||
void 'test not include super properties'() {
|
||||
String code = '''
|
||||
import groovy.transform.builder.Builder
|
||||
class Animal {
|
||||
String color
|
||||
int legs
|
||||
}
|
||||
|
||||
@Builder
|
||||
class Pet extends Animal{
|
||||
String name
|
||||
}
|
||||
|
||||
new Pet().builder().<caret>
|
||||
'''
|
||||
doVariantableTest code, CompletionResult.contain, 'name'
|
||||
doVariantableTest code, CompletionResult.notContain, 'color', 'legs'
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+58
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
* 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.
|
||||
@@ -263,4 +263,61 @@ class PojoBuilder {}
|
||||
new PojoBuilder().counter(1).name("Janet").<caret>
|
||||
''', 'build', 'name', 'dynamic', 'counter'
|
||||
}
|
||||
|
||||
void 'test not include super properties'() {
|
||||
myFixture.addClass('''
|
||||
class Child extends Pojo {
|
||||
String secondName;
|
||||
public void setSecondName(String secondName) {}
|
||||
}
|
||||
''')
|
||||
|
||||
String code = '''
|
||||
import groovy.transform.builder.Builder
|
||||
import groovy.transform.builder.ExternalStrategy
|
||||
|
||||
class Pojo {
|
||||
String name
|
||||
def dynamic
|
||||
int counter
|
||||
|
||||
def method() {}
|
||||
}
|
||||
|
||||
class Child extends Pojo {
|
||||
String secondName
|
||||
}
|
||||
|
||||
@Builder(builderStrategy = ExternalStrategy, forClass = Child)
|
||||
class PojoBuilder {}
|
||||
|
||||
new PojoBuilder().<caret>
|
||||
'''
|
||||
doVariantableTest code, CompletionResult.contain, 'secondName'
|
||||
doVariantableTest code, CompletionResult.notContain, 'name', 'dynamic', 'counter'
|
||||
}
|
||||
|
||||
void 'test include super properties'() {
|
||||
doVariantableTest '''
|
||||
import groovy.transform.builder.Builder
|
||||
import groovy.transform.builder.ExternalStrategy
|
||||
|
||||
class Pojo {
|
||||
String name
|
||||
def dynamic
|
||||
int counter
|
||||
|
||||
def method() {}
|
||||
}
|
||||
|
||||
class Child extends Pojo {
|
||||
String secondName
|
||||
}
|
||||
|
||||
@Builder(builderStrategy = ExternalStrategy, forClass = Child, includeSuperProperties = true)
|
||||
class PojoBuilder {}
|
||||
|
||||
new PojoBuilder().<caret>
|
||||
''', CompletionResult.contain, 'secondName', 'name', 'dynamic', 'counter'
|
||||
}
|
||||
}
|
||||
|
||||
+41
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
* 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.
|
||||
@@ -184,4 +184,44 @@ new PojoBuilder().<caret>
|
||||
''', CompletionResult.notContain, 'private', 'packageLocal', 'someFieldWithoutSetter'
|
||||
}
|
||||
|
||||
void 'test not include super properties'() {
|
||||
myFixture.addClass('''
|
||||
class Child extends Pojo {
|
||||
String secondName;
|
||||
public void setSecondName(String secondName) {}
|
||||
}
|
||||
''')
|
||||
|
||||
String code = '''
|
||||
import groovy.transform.builder.Builder
|
||||
import groovy.transform.builder.ExternalStrategy
|
||||
|
||||
@Builder(builderStrategy = ExternalStrategy, forClass = Child)
|
||||
class PojoBuilder {}
|
||||
|
||||
new PojoBuilder().<caret>
|
||||
'''
|
||||
doVariantableTest code, CompletionResult.contain, 'secondName'
|
||||
doVariantableTest code, CompletionResult.notContain, 'name', 'dynamic', 'counter', 'withoutField'
|
||||
}
|
||||
|
||||
void 'test include super properties'() {
|
||||
myFixture.addClass('''
|
||||
class Child extends Pojo {
|
||||
String secondName;
|
||||
public void setSecondName(String secondName) {}
|
||||
}
|
||||
''')
|
||||
|
||||
doVariantableTest '''
|
||||
import groovy.transform.builder.Builder
|
||||
import groovy.transform.builder.ExternalStrategy
|
||||
|
||||
@Builder(builderStrategy = ExternalStrategy, forClass = Child, includeSuperProperties = true)
|
||||
class PojoBuilder {}
|
||||
|
||||
new PojoBuilder().<caret>
|
||||
''', CompletionResult.contain, 'secondName', 'name', 'dynamic', 'counter', 'withoutField'
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+43
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
* 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.
|
||||
@@ -16,6 +16,7 @@
|
||||
package org.jetbrains.plugins.groovy.completion.builder
|
||||
|
||||
import groovy.transform.CompileStatic
|
||||
import org.jetbrains.plugins.groovy.completion.CompletionResult
|
||||
|
||||
@CompileStatic
|
||||
class GrInitializerBuilderStrategyTest extends GrBuilderTransformationCompletionTestBase {
|
||||
@@ -217,4 +218,45 @@ class Pojo {
|
||||
Pojo.createInitializer().counter(1).name("Janet").<caret>
|
||||
''', 'name', 'dynamic', 'counter'
|
||||
}
|
||||
|
||||
void 'test include super properties'() {
|
||||
doVariantableTest '''
|
||||
import groovy.transform.builder.Builder
|
||||
import groovy.transform.builder.InitializerStrategy
|
||||
|
||||
class Animal {
|
||||
String color
|
||||
int legs
|
||||
}
|
||||
|
||||
@Builder(includeSuperProperties = true, builderStrategy = InitializerStrategy)
|
||||
class Pet extends Animal{
|
||||
String name
|
||||
}
|
||||
|
||||
Pet.createInitializer().<caret>
|
||||
''', 'legs', 'color', 'name'
|
||||
}
|
||||
|
||||
void 'test not include super properties'() {
|
||||
String code = '''
|
||||
import groovy.transform.builder.Builder
|
||||
import groovy.transform.builder.InitializerStrategy
|
||||
|
||||
class Animal {
|
||||
String color
|
||||
int legs
|
||||
}
|
||||
|
||||
@Builder(builderStrategy = InitializerStrategy)
|
||||
class Pet extends Animal{
|
||||
String name
|
||||
}
|
||||
|
||||
Pet.createInitializer().<caret>
|
||||
'''
|
||||
doVariantableTest code, CompletionResult.contain, 'name'
|
||||
doVariantableTest code, CompletionResult.notContain, 'color', 'legs'
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+19
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
* 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.
|
||||
@@ -198,4 +198,22 @@ class Pojo {
|
||||
new Pojo().lolName("Janet").lolCounter(35).<caret>
|
||||
''', 'lolName', 'lolDynamic', 'lolCounter', 'method'
|
||||
}
|
||||
|
||||
void 'test return type with include super'() {
|
||||
doVariantableTest('''
|
||||
import groovy.transform.builder.Builder
|
||||
import groovy.transform.builder.SimpleStrategy
|
||||
|
||||
@Builder(builderStrategy = SimpleStrategy, includeSuperProperties = true)
|
||||
class Pojo {
|
||||
String name
|
||||
def dynamic
|
||||
int counter
|
||||
|
||||
def method() {}
|
||||
}
|
||||
|
||||
new Pojo().setName().<caret>
|
||||
''', CompletionResult.notContain,'setDynamic', 'setCounter')
|
||||
}
|
||||
}
|
||||
|
||||
+68
@@ -387,6 +387,74 @@ new B().foo()
|
||||
}
|
||||
|
||||
|
||||
void testBuilderSimpleStrategyError() {
|
||||
myFixture.addClass('''\
|
||||
package groovy.transform.builder;
|
||||
@Target({ ElementType.TYPE})
|
||||
|
||||
public @interface Builder {
|
||||
Class<?> builderStrategy();
|
||||
boolean includeSuperProperties() default false;
|
||||
}
|
||||
''')
|
||||
|
||||
myFixture.addClass('''
|
||||
package groovy.transform.builder;
|
||||
public class SimpleStrategy {}
|
||||
''')
|
||||
|
||||
myFixture.configureByText('a.groovy', '''
|
||||
import groovy.transform.builder.Builder
|
||||
import groovy.transform.builder.SimpleStrategy
|
||||
|
||||
<error>@Builder(builderStrategy = SimpleStrategy, includeSuperProperties = true)</error>
|
||||
class Pojo {
|
||||
String name
|
||||
def dynamic
|
||||
int counter
|
||||
|
||||
def method() {}
|
||||
}
|
||||
''')
|
||||
|
||||
fixture.checkHighlighting()
|
||||
}
|
||||
|
||||
void testBuilderSimpleStrategy() {
|
||||
myFixture.addClass('''\
|
||||
package groovy.transform.builder;
|
||||
@Target({ ElementType.TYPE})
|
||||
|
||||
public @interface Builder {
|
||||
Class<?> builderStrategy();
|
||||
boolean includeSuperProperties() default false;
|
||||
}
|
||||
''')
|
||||
|
||||
myFixture.addClass('''
|
||||
package groovy.transform.builder;
|
||||
public class SimpleStrategy {}
|
||||
''')
|
||||
|
||||
myFixture.configureByText('a.groovy', '''
|
||||
import groovy.transform.builder.Builder
|
||||
import groovy.transform.builder.SimpleStrategy
|
||||
|
||||
@Builder(builderStrategy = SimpleStrategy)
|
||||
class Pojo {
|
||||
String name
|
||||
def dynamic
|
||||
int counter
|
||||
|
||||
def method() {}
|
||||
}
|
||||
new Pojo().setName("sd").setCounter(5)
|
||||
''')
|
||||
|
||||
fixture.checkHighlighting()
|
||||
}
|
||||
|
||||
|
||||
void testPrimitiveTypeParams() {
|
||||
myFixture.configureByText('a.groovy', '''\
|
||||
List<<error descr="Primitive type parameters are not allowed in type parameter list">int</error>> list = new ArrayList<int><EOLError descr="'(' expected"></EOLError>
|
||||
|
||||
Reference in New Issue
Block a user