| /******************************************************************************* |
| * 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); |
| } |
| } |
| |
| } |