/* * 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.configSlurper; import com.intellij.psi.CommonClassNames; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiType; import com.intellij.psi.util.InheritanceUtil; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.extensions.GroovyMapContentProvider; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; import org.jetbrains.plugins.groovy.lang.psi.impl.GrMapType; import org.jetbrains.plugins.groovy.lang.psi.typeEnhancers.GrReferenceTypeEnhancer; /** * @author Sergey Evdokimov */ public class GroovyMapValueTypeEnhancer extends GrReferenceTypeEnhancer { @Override public PsiType getReferenceType(GrReferenceExpression ref, @Nullable PsiElement resolved) { if (resolved != null) return null; GrExpression qualifierExpression = ref.getQualifierExpression(); if (qualifierExpression == null) return null; PsiType mapType = qualifierExpression.getType(); if (!InheritanceUtil.isInheritor(mapType, CommonClassNames.JAVA_UTIL_MAP)) { return null; } PsiElement qResolved; if (qualifierExpression instanceof GrReferenceExpression) { qResolved = ((GrReferenceExpression)qualifierExpression).resolve(); } else if (qualifierExpression instanceof GrMethodCall) { qResolved = ((GrMethodCall)qualifierExpression).resolveMethod(); } else { return null; } String key = ref.getReferenceName(); if (key == null) return null; for (GroovyMapContentProvider provider : GroovyMapContentProvider.EP_NAME.getExtensions()) { PsiType type = provider.getValueType(qualifierExpression, qResolved, key); if (type != null) { return type; } } if (mapType instanceof GrMapType) { return ((GrMapType)mapType).getTypeByStringKey(key); } return null; } }