/** * Return true if the DeclarationExpression represents a 'final' variable declaration. * * NOTE: THIS IS A WORKAROUND. * * There does not seem to be an easy way to determine whether the 'final' modifier has been * specified for a variable declaration. Return true if the 'final' is present before the variable name. */ public static boolean isFinalVariable(DeclarationExpression declarationExpression, SourceCode sourceCode) { if (isFromGeneratedSourceCode(declarationExpression)) { return false; } List<Expression> variableExpressions = getVariableExpressions(declarationExpression); if (!variableExpressions.isEmpty()) { Expression variableExpression = variableExpressions.get(0); int startOfDeclaration = declarationExpression.getColumnNumber(); int startOfVariableName = variableExpression.getColumnNumber(); int sourceLineNumber = findFirstNonAnnotationLine(declarationExpression, sourceCode); String sourceLine = sourceCode.getLines().get(sourceLineNumber-1); String modifiers = (startOfDeclaration >= 0 && startOfVariableName >= 0 && sourceLine.length() >= startOfVariableName) ? sourceLine.substring(startOfDeclaration - 1, startOfVariableName - 1) : ""; return modifiers.contains("final"); } return false; }
@Override public void visitDeclarationExpression(DeclarationExpression expression) { // if we are in the same block we check position, if it occurs after // current position we ignore it if (blocks.isEmpty() && expression.getLineNumber() >= 0 && expression.getColumnNumber() >= 0 && path.getLineNumber() >= 0 && path.getColumnNumber() >= 0 && (expression.getLineNumber() > path.getLineNumber() || (expression.getLineNumber() == path.getLineNumber() && expression.getColumnNumber() >= path.getColumnNumber()))) { return; } if (!expression.isMultipleAssignmentDeclaration()) { VariableExpression variableExpression = expression.getVariableExpression(); if (variableExpression.getAccessedVariable() != null) { String name = variableExpression.getAccessedVariable().getName(); variables.put(name, variableExpression.getAccessedVariable()); } } // perhaps we could visit just declaration or do nothing super.visitDeclarationExpression(expression); }