- final PsiType overloadedOperatorType = TypesUtil.getOverloadedOperatorType(thisType, "getAt", this, argTypes);
- if (overloadedOperatorType!=null) {
- return overloadedOperatorType;
+ if (thisType instanceof GrTupleType) {
+ PsiType[] types = ((GrTupleType)thisType).getParameters();
+ return types.length == 1 ? types[0] : null;
+ }
+
+ PsiType overloadedOperatorType = null;
+ final GroovyResolveResult[] candidates = TypesUtil.getOverloadedOperatorCandidates(thisType, "getAt", this, argTypes);
+ if (candidates.length == 1) {
+ final PsiElement element = candidates[0].getElement();
+ if (element instanceof PsiMethod) {
+ overloadedOperatorType = candidates[0].getSubstitutor().substitute(((PsiMethod)element).getReturnType());
+ if (overloadedOperatorType != null && !(element instanceof GrGdkMethod)) { //gdk 'getAt' methods don't have information about type parameters
+ return overloadedOperatorType;
+ }
+ }