/******************************************************************************
* Copyright (C) 2006-2013 IFS Institute for Software and others
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Original authors:
* Dennis Hunziker
* Ueli Kistler
* Reto Schuettel
* Robin Stocker
* Contributors:
* Fabio Zadrozny <fabiofz@gmail.com> - initial implementation
******************************************************************************/
/*
* Copyright (C) 2006, 2007 Dennis Hunziker, Ueli Kistler
* Copyright (C) 2007 Reto Schuettel, Robin Stocker
*
* IFS Institute for Software, HSR Rapperswil, Switzerland
*
*/
package org.python.pydev.refactoring.core.validator;
import java.util.Arrays;
import java.util.List;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.python.pydev.refactoring.ast.adapters.AbstractScopeNode;
import org.python.pydev.refactoring.ast.adapters.FunctionDefAdapter;
import org.python.pydev.refactoring.ast.visitors.CannotCreateContextRuntimeException;
import org.python.pydev.refactoring.messages.Messages;
public class NameValidator {
// match invalid keywords (Python pocket reference)
// Self is not really a keyword, but
private static final List<String> KEYWORDS;
static {
KEYWORDS = Arrays.asList(new String[] { "and", "assert", "break", "class", "continue", "def", "del", "elif",
"else", "except", "exec", "finally", "for", "from", "global", "if", "import", "in", "is", "lambda",
"not", "or", "pass", "print", "raise", "return", "try", "while", "yield" });
}
private static final String NAME_PATTERN = "[a-zA-Z_][a-zA-Z_0-9]*";
private AbstractScopeNode<?> scopeNode;
private RefactoringStatus status;
public NameValidator(RefactoringStatus status, AbstractScopeNode<?> scope) {
this.status = status;
this.scopeNode = scope;
}
public void validateUniqueVariable(String name) {
try {
if (scopeNode.alreadyUsedName(name)) {
status.addWarning(Messages.format(Messages.validationNameAlreadyUsed, name));
}
} catch (CannotCreateContextRuntimeException e) {
status.addWarning("Unable to check if name is already used.\nReason: " + e.getMessage());
}
}
public void validateVariableName(String name) {
validateName(name);
validateNotKeyword(name);
}
public void validateMethodName(String name) {
validateName(name);
validateNotKeyword(name);
}
private void validateNotKeyword(String name) {
if (KEYWORDS.contains(name)) {
status.addFatalError(Messages.format(Messages.validationReservedKeyword, name));
}
}
private void validateName(String name) {
if (name.equals("")) {
status.addFatalError(Messages.validationNameIsEmpty);
return;
}
if (!name.matches(NAME_PATTERN)) {
status.addFatalError(Messages.format(Messages.validationContainsInvalidChars, name));
}
}
public void validateUniqueFunction(String name) {
AbstractScopeNode<?> parentAdapter = scopeNode.getParent();
if (parentAdapter != null) {
for (FunctionDefAdapter function : parentAdapter.getFunctions()) {
if (function.getName().compareTo(name) == 0) {
status.addWarning(Messages.format(Messages.validationNameAlreadyUsed, name));
}
}
}
}
}