diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/GroovyBundle.properties b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/GroovyBundle.properties index 1b75fcb2309d..1410d78be7ef 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/GroovyBundle.properties +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/GroovyBundle.properties @@ -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 diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/annotator/checkers/BuilderAnnotationChecker.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/annotator/checkers/BuilderAnnotationChecker.java new file mode 100644 index 000000000000..0cad1ec6473e --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/annotator/checkers/BuilderAnnotationChecker.java @@ -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; + } +} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java index d28b87e5c2f7..8d5a3a87f1f8 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java @@ -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 fieldsMap = CollectClassMembersUtil.getAllFields(grType); + return getAllFields(grType, true); + } + + public static PsiField[] getAllFields(GrTypeDefinition grType, boolean includeSynthetic) { + Map fieldsMap = CollectClassMembersUtil.getAllFields(grType, includeSynthetic); return ContainerUtil.map2Array(fieldsMap.values(), PsiField.class, entry -> (PsiField)entry.getElement()); } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/BuilderAnnotationContributor.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/BuilderAnnotationContributor.java index 5ed13aac803c..1146487c2754 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/BuilderAnnotationContributor.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/BuilderAnnotationContributor.java @@ -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 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); + } } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/DefaultBuilderStrategySupport.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/DefaultBuilderStrategySupport.java index 5ac5ffe9d8ef..953c18e3d948 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/DefaultBuilderStrategySupport.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/DefaultBuilderStrategySupport.java @@ -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 diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/ExternalBuilderStrategySupport.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/ExternalBuilderStrategySupport.java index 8c436aeb5e75..61610ad96a7f 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/ExternalBuilderStrategySupport.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/ExternalBuilderStrategySupport.java @@ -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 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); } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/InitializerBuilderStrategySupport.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/InitializerBuilderStrategySupport.java index 88c4fa07051f..6322ef86cc4d 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/InitializerBuilderStrategySupport.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/InitializerBuilderStrategySupport.java @@ -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], diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/SimpleBuilderStrategySupport.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/SimpleBuilderStrategySupport.java index e5ceb73e4bf7..98b161beac8a 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/SimpleBuilderStrategySupport.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/SimpleBuilderStrategySupport.java @@ -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)); } diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml index 4b064317149e..0a9834dce234 100644 --- a/plugins/groovy/src/META-INF/plugin.xml +++ b/plugins/groovy/src/META-INF/plugin.xml @@ -252,6 +252,7 @@ + diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrDefaultBuilderStrategyTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrDefaultBuilderStrategyTest.groovy index bfbe8bdd88bf..72f36251f136 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrDefaultBuilderStrategyTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrDefaultBuilderStrategyTest.groovy @@ -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"). ''', '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"). +''', '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"). +''', '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(). +''' + doVariantableTest code, CompletionResult.contain, 'name' + doVariantableTest code, CompletionResult.notContain, 'color', 'legs' + + } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrExternalBuilderStrategyTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrExternalBuilderStrategyTest.groovy index 631002878fe7..f87848fb60c6 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrExternalBuilderStrategyTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrExternalBuilderStrategyTest.groovy @@ -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"). ''', '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(). +''' + 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(). +''', CompletionResult.contain, 'secondName', 'name', 'dynamic', 'counter' + } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrExternalBuilderStrategyWithJavaClassTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrExternalBuilderStrategyWithJavaClassTest.groovy index c5ccb5238c92..46c9ca3120c1 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrExternalBuilderStrategyWithJavaClassTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrExternalBuilderStrategyWithJavaClassTest.groovy @@ -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(). ''', 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(). +''' + 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(). +''', CompletionResult.contain, 'secondName', 'name', 'dynamic', 'counter', 'withoutField' + } + } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrInitializerBuilderStrategyTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrInitializerBuilderStrategyTest.groovy index fc1e9ed36613..989f269138d3 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrInitializerBuilderStrategyTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrInitializerBuilderStrategyTest.groovy @@ -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"). ''', '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(). +''', '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(). +''' + doVariantableTest code, CompletionResult.contain, 'name' + doVariantableTest code, CompletionResult.notContain, 'color', 'legs' + + } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrSimpleBuilderStrategyTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrSimpleBuilderStrategyTest.groovy index d06514aea49f..1f2588dfda8c 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrSimpleBuilderStrategyTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/builder/GrSimpleBuilderStrategyTest.groovy @@ -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). ''', '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(). +''', CompletionResult.notContain,'setDynamic', 'setCounter') + } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy index 10b7aa2f8a0a..44943254d3bc 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy @@ -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 + +@Builder(builderStrategy = SimpleStrategy, includeSuperProperties = true) +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<int> list = new ArrayList