blob: 12c7b786d33ca01ce9bbca7380b8fbfb7f753709 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2006 IBM Corporation 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
*
* Contributors: Sian January - initial version
******************************************************************************/
package org.eclipse.ajdt.internal.ui.editor;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.aspectj.org.eclipse.jdt.internal.compiler.IProblemFactory;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.aspectj.org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
import org.eclipse.ajdt.core.javaelements.AJCompilationUnitInfo;
import org.eclipse.ajdt.core.parserbridge.AJCompilationUnitStructureRequestor;
import org.eclipse.ajdt.core.parserbridge.AJSourceElementParser;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IProblemRequestor;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.compiler.IProblem;
import org.eclipse.jdt.internal.compiler.problem.DefaultProblem;
import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
import org.eclipse.jdt.internal.core.CompilationUnit;
import org.eclipse.jdt.internal.core.JavaModelManager;
import org.eclipse.jdt.internal.core.JavaProject;
import org.eclipse.jdt.internal.ui.text.java.IProblemRequestorExtension;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.AnnotationModelEvent;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.source.IAnnotationModelListener;
import org.eclipse.jface.text.source.IAnnotationModelListenerExtension;
/**
* Wrapper for a CompilationUnitAnnotationModel. Only used for non-.aj files
* (i.e. usually .java files)
* Uses AspectJ's eager parser to report errors and ignores errors from the JDT.
*/
public class CompilationUnitAnnotationModelWrapper implements IAnnotationModel, IProblemRequestor, IProblemRequestorExtension {
protected static class GlobalAnnotationModelListener implements IAnnotationModelListener, IAnnotationModelListenerExtension {
private ListenerList fListenerList;
public GlobalAnnotationModelListener() {
fListenerList= new ListenerList();
}
/**
* @see IAnnotationModelListener#modelChanged(IAnnotationModel)
*/
public void modelChanged(IAnnotationModel model) {
Object[] listeners= fListenerList.getListeners();
for (int i= 0; i < listeners.length; i++) {
((IAnnotationModelListener) listeners[i]).modelChanged(model);
}
}
/**
* @see IAnnotationModelListenerExtension#modelChanged(AnnotationModelEvent)
*/
public void modelChanged(AnnotationModelEvent event) {
Object[] listeners= fListenerList.getListeners();
for (int i= 0; i < listeners.length; i++) {
Object curr= listeners[i];
if (curr instanceof IAnnotationModelListenerExtension) {
((IAnnotationModelListenerExtension) curr).modelChanged(event);
}
}
}
public void addListener(IAnnotationModelListener listener) {
fListenerList.add(listener);
}
public void removeListener(IAnnotationModelListener listener) {
fListenerList.remove(listener);
}
}
private IAnnotationModel delegate;
private final ICompilationUnit unit;
public CompilationUnitAnnotationModelWrapper(final ICompilationUnit unit) {
this.unit = unit;
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.source.IAnnotationModel#addAnnotationModelListener(org.eclipse.jface.text.source.IAnnotationModelListener)
*/
public void addAnnotationModelListener(IAnnotationModelListener listener) {
if(delegate != null) {
delegate.addAnnotationModelListener(listener);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.source.IAnnotationModel#removeAnnotationModelListener(org.eclipse.jface.text.source.IAnnotationModelListener)
*/
public void removeAnnotationModelListener(IAnnotationModelListener listener) {
if(delegate != null) {
delegate.removeAnnotationModelListener(listener);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.source.IAnnotationModel#connect(org.eclipse.jface.text.IDocument)
*/
public void connect(IDocument document) {
if(delegate != null) {
delegate.connect(document);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.source.IAnnotationModel#disconnect(org.eclipse.jface.text.IDocument)
*/
public void disconnect(IDocument document) {
if(delegate != null) {
delegate.disconnect(document);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.source.IAnnotationModel#addAnnotation(org.eclipse.jface.text.source.Annotation, org.eclipse.jface.text.Position)
*/
public void addAnnotation(Annotation annotation, Position position) {
if(delegate != null) {
delegate.addAnnotation(annotation, position);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.source.IAnnotationModel#removeAnnotation(org.eclipse.jface.text.source.Annotation)
*/
public void removeAnnotation(Annotation annotation) {
if(delegate != null) {
delegate.removeAnnotation(annotation);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.source.IAnnotationModel#getAnnotationIterator()
*/
public Iterator getAnnotationIterator() {
if(delegate != null) {
return delegate.getAnnotationIterator();
} else {
return null;
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.source.IAnnotationModel#getPosition(org.eclipse.jface.text.source.Annotation)
*/
public Position getPosition(Annotation annotation) {
if(delegate != null) {
return delegate.getPosition(annotation);
} else {
return null;
}
}
/* (non-Javadoc)
* @see org.eclipse.jdt.core.IProblemRequestor#acceptProblem(org.eclipse.jdt.core.compiler.IProblem)
*/
public void acceptProblem(IProblem problem) {
// bug 155225: use delegate for Task problems, ignore everything else
if ((delegate != null) && (problem.getID() == IProblem.Task)) {
((IProblemRequestor)delegate).acceptProblem(problem);
}
}
/* (non-Javadoc)
* @see org.eclipse.jdt.core.IProblemRequestor#beginReporting()
*/
public void beginReporting() {
if (delegate != null) {
((IProblemRequestor)delegate).beginReporting();
IJavaProject project = unit.getJavaProject();
AJCompilationUnitStructureRequestor requestor = new AJCompilationUnitStructureRequestor(unit, new AJCompilationUnitInfo(), new HashMap());
JavaModelManager.PerWorkingCopyInfo perWorkingCopyInfo = ((CompilationUnit)unit).getPerWorkingCopyInfo();
boolean computeProblems = JavaProject.hasJavaNature(project.getProject()) && perWorkingCopyInfo != null && perWorkingCopyInfo.isActive();
IProblemFactory problemFactory = new DefaultProblemFactory();
Map options = project.getOptions(true);
IBuffer buffer;
try {
buffer = unit.getBuffer();
final char[] contents = buffer == null ? null : buffer.getCharacters();
AJSourceElementParser parser = new AJSourceElementParser(
requestor,
problemFactory,
new CompilerOptions(options),
true/*report local declarations*/,false);
parser.reportOnlyOneSyntaxError = !computeProblems;
parser.scanner.source = contents;
requestor.setParser(parser);
CompilationUnitDeclaration unitDec = parser.parseCompilationUnit(new org.aspectj.org.eclipse.jdt.internal.compiler.env.ICompilationUnit() {
public char[] getContents() {
return contents;
}
public char[] getMainTypeName() {
return ((CompilationUnit)unit).getMainTypeName();
}
public char[][] getPackageName() {
return ((CompilationUnit)unit).getPackageName();
}
public char[] getFileName() {
return ((CompilationUnit)unit).getFileName();
}
public boolean ignoreOptionalProblems() {
return false;
}
}, true /*full parse to find local elements*/);
org.aspectj.org.eclipse.jdt.core.compiler.IProblem[] problems = unitDec.compilationResult.problems;
if (problems != null){
for (int i = 0; i < problems.length; i++) {
org.aspectj.org.eclipse.jdt.core.compiler.IProblem problem = problems[i];
if (problem == null)
continue;
((IProblemRequestor)delegate).acceptProblem(new DefaultProblem(
problem.getOriginatingFileName(),
problem.getMessage(),
problem.getID(),
problem.getArguments(),
problem.isError()?ProblemSeverities.Error:ProblemSeverities.Warning,
problem.getSourceStart(),
problem.getSourceEnd(),
problem.getSourceLineNumber(),
0)); // unknown column
}
}
} catch (JavaModelException e) {
}
}
}
/* (non-Javadoc)
* @see org.eclipse.jdt.core.IProblemRequestor#endReporting()
*/
public void endReporting() {
if(delegate != null) {
((IProblemRequestor)delegate).endReporting();
}
}
/* (non-Javadoc)
* @see org.eclipse.jdt.core.IProblemRequestor#isActive()
*/
public boolean isActive() {
if(delegate != null) {
return ((IProblemRequestor)delegate).isActive();
} else {
return false;
}
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.ui.text.java.IProblemRequestorExtension#setProgressMonitor(org.eclipse.core.runtime.IProgressMonitor)
*/
public void setProgressMonitor(IProgressMonitor monitor) {
if(delegate != null) {
((IProblemRequestorExtension)delegate).setProgressMonitor(monitor);
}
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.ui.text.java.IProblemRequestorExtension#setIsActive(boolean)
*/
public void setIsActive(boolean isActive) {
if(delegate != null) {
((IProblemRequestorExtension)delegate).setIsActive(isActive);
}
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.ui.text.java.IProblemRequestorExtension#beginReportingSequence()
*/
public void beginReportingSequence() {
if(delegate != null) {
((IProblemRequestorExtension)delegate).beginReportingSequence();
}
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.ui.text.java.IProblemRequestorExtension#endReportingSequence()
*/
public void endReportingSequence() {
if(delegate != null) {
((IProblemRequestorExtension)delegate).endReportingSequence();
}
}
/**
* @param annotationModel
*/
public void setDelegate(IAnnotationModel annotationModel) {
delegate = annotationModel;
}
public void setIsHandlingTemporaryProblems(boolean enable) {
if(delegate != null) {
((IProblemRequestorExtension)delegate).setIsHandlingTemporaryProblems(enable);
}
}
}