/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.source.formatter.checks; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.tools.ToolsUtil; import com.liferay.source.formatter.parser.JavaSignature; import com.liferay.source.formatter.parser.JavaTerm; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author Hugo Huijser */ public class JavaReturnStatementCheck extends BaseJavaTermCheck { @Override protected String doProcess( String fileName, String absolutePath, JavaTerm javaTerm, String fileContent) { return _formatReturnStatements(javaTerm); } @Override protected String[] getCheckableJavaTermNames() { return new String[] {JAVA_CONSTRUCTOR, JAVA_METHOD}; } private String _formatReturnStatement( String javaTermContent, String returnStatement, String tabs, String ifCondition, String trueValue, String falseValue) { StringBundler sb = new StringBundler(15); sb.append("\n"); sb.append(tabs); sb.append("if ("); sb.append(ifCondition); sb.append(") {\n\n"); sb.append(tabs); sb.append("\treturn "); sb.append(trueValue); sb.append(";\n"); sb.append(tabs); sb.append("}\n\n"); sb.append(tabs); sb.append("return "); sb.append(falseValue); sb.append(";\n"); return StringUtil.replace( javaTermContent, returnStatement, sb.toString()); } private String _formatReturnStatements(JavaTerm javaTerm) { String javaTermContent = javaTerm.getContent(); JavaSignature signature = javaTerm.getSignature(); String returnType = signature.getReturnType(); Matcher matcher1 = _returnPattern.matcher(javaTermContent); while (matcher1.find()) { String returnStatement = matcher1.group(); if (returnStatement.contains("\t//") || returnStatement.contains(" {\n")) { continue; } String[] ternaryOperatorParts = getTernaryOperatorParts( matcher1.group(2)); if (ternaryOperatorParts != null) { String falseValue = ternaryOperatorParts[2]; String ifCondition = ternaryOperatorParts[0]; String trueValue = ternaryOperatorParts[1]; return _formatReturnStatement( javaTermContent, returnStatement, matcher1.group(1), ifCondition, trueValue, falseValue); } if ((returnType == null) || !returnType.equals("boolean")) { continue; } String strippedReturnStatement = stripQuotes(returnStatement); if (strippedReturnStatement.contains("|") || strippedReturnStatement.contains("&") || strippedReturnStatement.contains("^")) { return _formatReturnStatement( javaTermContent, returnStatement, matcher1.group(1), matcher1.group(2), "true", "false"); } Matcher matcher2 = _relationalOperatorPattern.matcher( returnStatement); if (matcher2.find() && !ToolsUtil.isInsideQuotes(returnStatement, matcher2.start(1))) { return _formatReturnStatement( javaTermContent, returnStatement, matcher1.group(1), matcher1.group(2), "true", "false"); } } return javaTermContent; } private final Pattern _relationalOperatorPattern = Pattern.compile( ".* (==|!=|<|>|>=|<=)[ \n].*"); private final Pattern _returnPattern = Pattern.compile( "\n(\t+)return (.*?);\n", Pattern.DOTALL); }