/**
* Copyright (c) 2005-2012 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
/*
* Created on 19/07/2005
*/
package com.python.pydev.analysis;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jface.text.IDocument;
import org.python.pydev.builder.pep8.Pep8Visitor;
import org.python.pydev.core.IIndentPrefs;
import org.python.pydev.core.IPythonNature;
import org.python.pydev.core.log.Log;
import org.python.pydev.editor.codecompletion.revisited.modules.SourceModule;
import org.python.pydev.parser.jython.SimpleNode;
import com.python.pydev.analysis.messages.IMessage;
import com.python.pydev.analysis.tabnanny.TabNanny;
import com.python.pydev.analysis.visitors.OccurrencesVisitor;
/**
* This class is responsible for starting the analysis of a given module.
*
* @author Fabio
*/
public class OccurrencesAnalyzer {
public IMessage[] analyzeDocument(IPythonNature nature, final SourceModule module,
final IAnalysisPreferences prefs,
final IDocument document, final IProgressMonitor monitor, IIndentPrefs indentPrefs) {
//Do pep8 in a thread.
final List<IMessage> pep8Messages = new ArrayList<>();
Thread t = new Thread() {
@Override
public void run() {
pep8Messages.addAll(new Pep8Visitor().getMessages(module, document, monitor, prefs));
}
};
t.start();
OccurrencesVisitor visitor = new OccurrencesVisitor(nature, module.getName(), module, prefs, document, monitor);
try {
SimpleNode ast = module.getAst();
if (ast != null) {
if (nature.startRequests()) {
try {
ast.accept(visitor);
} finally {
nature.endRequests();
}
}
}
} catch (OperationCanceledException e) {
throw e;
} catch (Exception e) {
Log.log(IStatus.ERROR, ("Error while visiting " + module.getName() + " (" + module.getFile() + ")"), e);
}
List<IMessage> messages = new ArrayList<IMessage>();
if (!monitor.isCanceled()) {
messages = visitor.getMessages();
try {
messages.addAll(TabNanny.analyzeDoc(document, prefs, module.getName(), indentPrefs, monitor));
} catch (Exception e) {
Log.log(e); //just to be safe... (could happen if the document changes during the process).
}
}
if (!monitor.isCanceled()) {
try {
t.join();
messages.addAll(pep8Messages);
} catch (InterruptedException e) {
//If interrupted keep on going as it is.
}
}
return messages.toArray(new IMessage[messages.size()]);
}
}