IDEA-170948 Support @Builder includeSuperProperties

This commit is contained in:
alexey.afanasiev
2017-05-18 13:16:21 +03:00
parent 47db659250
commit fd45e2db55
15 changed files with 390 additions and 33 deletions
@@ -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
@@ -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;
}
}
@@ -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());
}
@@ -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);
}
}
@@ -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
@@ -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);
}
@@ -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],
@@ -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));
}
+1
View File
@@ -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"/>
@@ -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'
}
}
@@ -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'
}
}
@@ -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'
}
}
@@ -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'
}
}
@@ -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')
}
}
@@ -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>