From 2656dddf65dfdf5a4feac8efb370ccfecc64ebe8 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Tue, 27 Oct 2015 18:51:12 +0300 Subject: [PATCH] [groovy] map access improvements - Do not resolve reference if qualifier is inheritor of `java.util.Map`. - Get inferred type from map access only when qualifier is not resolved to a class. - Use qualifier's full type instead of nominal type when getting map values type. --- .../GrReferenceExpressionImpl.java | 35 +++++++-------- .../lang/resolve/ResolvePropertyTest.groovy | 44 ++++++++++++++++++- 2 files changed, 60 insertions(+), 19 deletions(-) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java index a902b28eb5d9..a81faacac7ea 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java @@ -105,13 +105,7 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImplss''') assert !ref.resolve() } + void 'test custom map properties'() { + myFixture.addFileToProject 'classes.groovy', '''\ +class Pojo { + def pojoProperty + def anotherPojoProperty +} + +class SomeMapClass extends HashMap { + + public static final CONSTANT = 1 + + static class Inner { + public static final INNER_CONSTANT = 4 + } +} +''' + (configureByText('SomeMapClass.CONSTANT').element as GrReferenceExpression).with { ref -> + assert ref.resolve() instanceof GrField + assert ref.type.equalsToText('java.lang.Integer') + } + (configureByText('SomeMapClass.Inner').element as GrReferenceExpression).with { ref -> + assert ref.resolve() instanceof GrClassDefinition + assert ref.type.equalsToText('java.lang.Class') + } + assert configureByText('SomeMapClass.Inner.INNER_CONSTANT').resolve() instanceof GrField + + assert !configureByText('def m = new SomeMapClass(); m.CONSTANT').resolve() + assert !configureByText('def m = new SomeMapClass(); m.Inner').resolve() + + configureByText('def m = new SomeMapClass(); m.CONSTANT.pojoProperty').resolve().with { resolved -> + assert resolved instanceof GrAccessorMethod + assert resolved.containingClass.name == 'Pojo' + } + configureByText('def m = new SomeMapClass(); m.Inner.anotherPojoProperty').resolve().with { resolved -> + assert resolved instanceof GrAccessorMethod + assert resolved.containingClass.name == 'Pojo' + } + } + public void testResolveInsideWith0() { def resolved = resolve('a.groovy', GrAccessorMethod) assertEquals(resolved.containingClass.name, 'A')