Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalAnnotationReferenceDetector.java')
-rw-r--r--apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalAnnotationReferenceDetector.java131
1 files changed, 131 insertions, 0 deletions
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalAnnotationReferenceDetector.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalAnnotationReferenceDetector.java
new file mode 100644
index 0000000000..a835bc7c65
--- /dev/null
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalAnnotationReferenceDetector.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) Aug 21, 2013 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.pde.api.tools.internal.builder;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IAnnotatable;
+import org.eclipse.jdt.core.IAnnotation;
+import org.eclipse.jdt.core.ISourceRange;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.Position;
+import org.eclipse.pde.api.tools.internal.provisional.builder.IReference;
+import org.eclipse.pde.api.tools.internal.provisional.model.IApiElement;
+import org.eclipse.pde.api.tools.internal.provisional.model.IApiField;
+import org.eclipse.pde.api.tools.internal.provisional.model.IApiMember;
+import org.eclipse.pde.api.tools.internal.provisional.model.IApiMethod;
+import org.eclipse.pde.api.tools.internal.provisional.model.IApiType;
+import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblem;
+import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblemTypes;
+import org.eclipse.pde.api.tools.internal.util.Signatures;
+
+/**
+ * Detector for illegally referenced annotations
+ *
+ * @since 1.0.600
+ */
+public class IllegalAnnotationReferenceDetector extends AbstractIllegalTypeReference {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.pde.api.tools.internal.provisional.builder.IApiProblemDetector#getReferenceKinds()
+ */
+ public int getReferenceKinds() {
+ return IReference.REF_ANNOTATION_USE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.pde.api.tools.internal.builder.AbstractProblemDetector#getProblemFlags(org.eclipse.pde.api.tools.internal.provisional.builder.IReference)
+ */
+ protected int getProblemFlags(IReference reference) {
+ return IApiProblem.ANNOTATION;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.pde.api.tools.internal.builder.AbstractProblemDetector#getProblemKind()
+ */
+ protected int getProblemKind() {
+ return IApiProblem.ILLEGAL_REFERENCE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.pde.api.tools.internal.builder.AbstractProblemDetector#getSeverityKey()
+ */
+ protected String getSeverityKey() {
+ return IApiProblemTypes.ILLEGAL_REFERENCE;
+ }
+
+ public boolean considerReference(IReference reference) {
+ return super.considerReference(reference);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.pde.api.tools.internal.builder.AbstractIllegalTypeReference#getSourceRange(org.eclipse.jdt.core.IType, org.eclipse.jface.text.IDocument, org.eclipse.pde.api.tools.internal.provisional.builder.IReference)
+ */
+ protected Position getSourceRange(IType type, IDocument doc, IReference reference) throws CoreException, BadLocationException {
+ IApiMember member = reference.getMember();
+ if(member != null) {
+ IAnnotatable annotable = findAnnotableElement(type, member, reference, doc);
+ if(annotable != null) {
+ IAnnotation[] annots = annotable.getAnnotations();
+ String typename = Signatures.getSimpleTypeName(reference.getResolvedReference().getName());
+ for (int i = 0; i < annots.length; i++) {
+ if(annots[i].getElementName().equals(typename)) {
+ ISourceRange range = annots[i].getNameRange();
+ if(range != null) {
+ //select the '@' as well - augment offset and length accordingly
+ return new Position(range.getOffset()-1, range.getLength()+1);
+ }
+ else {
+ break;
+ }
+ }
+ }
+ }
+ }
+ return defaultSourcePosition(type, reference);
+ }
+
+ /**
+ * Tries to find the {@link IAnnotatable} parent for the given {@link IApiMember}. If the direct parent
+ * cannot be computed return <code>null</code> and not the enclosing {@link IAnnotatable} (if there is one). That way
+ * we can fetch the default illegal type reference message location
+ *
+ * @param type
+ * @param member
+ * @param reference
+ * @param doc
+ * @return the {@link IAnnotatable} parent or <code>null</code> if it could not be computed.
+ * @throws CoreException
+ */
+ IAnnotatable findAnnotableElement(IType type, IApiMember member, IReference reference, IDocument doc) throws CoreException {
+ switch(member.getType()) {
+ case IApiElement.TYPE: {
+ return findTypeInType(type, (IApiType) member, reference, doc);
+ }
+ case IApiElement.FIELD: {
+ return findFieldInType(type, (IApiField) member);
+ }
+ case IApiElement.METHOD: {
+ return findMethodInType(type, (IApiMethod) member);
+ }
+ default: break;
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.pde.api.tools.internal.search.AbstractProblemDetector#getMessageArgs(org.eclipse.pde.api.tools.internal.provisional.model.IReference)
+ */
+ protected String[] getMessageArgs(IReference reference) throws CoreException {
+ return new String[] {getSimpleTypeName(reference.getResolvedReference())};
+ }
+}

Back to the top