PsiMethod (PsiMethod compiledMethod, ClsClassImpl trait) { final LightMethodBuilder result = new LightMethodBuilder(trait.getManager(), compiledMethod.getName()); result.setOriginInfo("via @Trait"); result.addModifier(PsiModifier.STATIC); for (PsiTypeParameter parameter : compiledMethod.getTypeParameters()) { result.addTypeParameter(parameter); } final PsiTypeVisitor<PsiType> corrector = createCorrector(compiledMethod, trait); final PsiParameter[] methodParameters = compiledMethod.getParameterList().getParameters(); for (int i = 1; i < methodParameters.length; i++) { final PsiParameter originalParameter = methodParameters[i]; final PsiType correctedType = originalParameter.getType().accept(corrector); result.addParameter(withType(originalParameter, correctedType)); } for (PsiClassType type : compiledMethod.getThrowsList().getReferencedTypes()) { final PsiType correctedType = type.accept(corrector); result.addException(correctedType instanceof PsiClassType ? (PsiClassType)correctedType : type); } final PsiType originalType = compiledMethod.getReturnType(); result.setMethodReturnType(originalType == null ? null : originalType.accept(corrector)); final PsiClass traitSource = trait.getSourceMirrorClass(); final PsiMethod sourceMethod = traitSource == null ? null : traitSource.findMethodBySignature(result, false); result.setNavigationElement(sourceMethod != null ? sourceMethod : compiledMethod); return result; }