private static void adjustPossibleEmptyTryStatement(PsiTryStatement tryStatement) throws IncorrectOperationException { PsiCodeBlock tryBlock = tryStatement.getTryBlock(); if (tryBlock != null) { if (tryStatement.getCatchSections().length == 0 && tryStatement.getFinallyBlock() == null) { PsiElement firstBodyElement = tryBlock.getFirstBodyElement(); if (firstBodyElement != null) { tryStatement .getParent() .addRangeAfter(firstBodyElement, tryBlock.getLastBodyElement(), tryStatement); } tryStatement.delete(); } } }
private static void addSuperCall( JavaChangeInfo changeInfo, PsiMethod constructor, PsiMethod callee, final UsageInfo[] usages) throws IncorrectOperationException { final PsiElementFactory factory = JavaPsiFacade.getElementFactory(constructor.getProject()); PsiExpressionStatement superCall = (PsiExpressionStatement) factory.createStatementFromText("super();", constructor); PsiCodeBlock body = constructor.getBody(); assert body != null; PsiStatement[] statements = body.getStatements(); if (statements.length > 0) { superCall = (PsiExpressionStatement) body.addBefore(superCall, statements[0]); } else { superCall = (PsiExpressionStatement) body.add(superCall); } PsiMethodCallExpression callExpression = (PsiMethodCallExpression) superCall.getExpression(); final PsiClass aClass = constructor.getContainingClass(); final PsiClass baseClass = changeInfo.getMethod().getContainingClass(); final PsiSubstitutor substitutor = TypeConversionUtil.getSuperClassSubstitutor(baseClass, aClass, PsiSubstitutor.EMPTY); processMethodUsage( callExpression.getMethodExpression(), changeInfo, true, false, callee, substitutor, usages); }
private void checkForSuperCall(PsiMethod method) { if (isConstructor()) { PsiCodeBlock body = method.getBody(); if (body == null) return; PsiStatement[] statements = body.getStatements(); boolean isBaseExplicitlyCalled = false; if (statements.length > 0) { PsiStatement first = statements[0]; if (first instanceof PsiExpressionStatement) { PsiExpression firstExpression = ((PsiExpressionStatement) first).getExpression(); if (firstExpression instanceof PsiMethodCallExpression) { PsiExpression qualifierExpression = ((PsiMethodCallExpression) firstExpression) .getMethodExpression() .getQualifierExpression(); if (qualifierExpression instanceof PsiReferenceExpression) { @NonNls String text = qualifierExpression.getText(); if ("super".equals(text) || text.equals("this")) { isBaseExplicitlyCalled = true; } } } } } if (!isBaseExplicitlyCalled) { for (RefClass superClass : getOwnerClass().getBaseClasses()) { RefMethodImpl superDefaultConstructor = (RefMethodImpl) superClass.getDefaultConstructor(); if (superDefaultConstructor != null) { superDefaultConstructor.addInReference(this); addOutReference(superDefaultConstructor); } } } } }
@Override public void buildReferences() { // Work on code block to find what we're referencing... PsiMethod method = (PsiMethod) getElement(); if (method == null) return; PsiCodeBlock body = method.getBody(); final RefJavaUtil refUtil = RefJavaUtil.getInstance(); refUtil.addReferences(method, this, body); refUtil.addReferences(method, this, method.getModifierList()); checkForSuperCall(method); setOnlyCallsSuper(refUtil.isMethodOnlyCallsSuper(method)); setBodyEmpty( isOnlyCallsSuper() || !isExternalOverride() && (body == null || body.getStatements().length == 0)); refUtil.addTypeReference(method, method.getReturnType(), getRefManager(), this); for (RefParameter parameter : getParameters()) { refUtil.setIsFinal(parameter, parameter.getElement().hasModifierProperty(PsiModifier.FINAL)); } getRefManager().fireBuildReferences(this); }