1 | /******************************************************************************* |
2 | * Copyright (c) 2008, 2009 IBM Corporation and others. |
3 | * All rights reserved. This program and the accompanying materials |
4 | * are made available under the terms of the Eclipse Public License v1.0 |
5 | * which accompanies this distribution, and is available at |
6 | * http://www.eclipse.org/legal/epl-v10.html |
7 | * |
8 | * Contributors: |
9 | * IBM Corporation - initial API and implementation |
10 | *******************************************************************************/ |
11 | package org.eclipse.pde.api.tools.internal.builder; |
12 | |
13 | import java.util.HashMap; |
14 | import java.util.Map; |
15 | |
16 | import org.eclipse.core.runtime.CoreException; |
17 | import org.eclipse.jdt.core.IType; |
18 | import org.eclipse.jface.text.BadLocationException; |
19 | import org.eclipse.jface.text.IDocument; |
20 | import org.eclipse.jface.text.Position; |
21 | import org.eclipse.pde.api.tools.internal.model.MethodKey; |
22 | import org.eclipse.pde.api.tools.internal.provisional.builder.IReference; |
23 | import org.eclipse.pde.api.tools.internal.provisional.descriptors.IElementDescriptor; |
24 | import org.eclipse.pde.api.tools.internal.provisional.descriptors.IFieldDescriptor; |
25 | import org.eclipse.pde.api.tools.internal.provisional.model.IApiField; |
26 | import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblem; |
27 | import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblemTypes; |
28 | |
29 | |
30 | /** |
31 | * Detects references to 'no reference' fields. |
32 | * |
33 | * @since 1.1 |
34 | */ |
35 | public class IllegalFieldReferenceDetector extends AbstractProblemDetector { |
36 | |
37 | /** |
38 | * Map of {@link org.eclipse.pde.api.tools.internal.model.MethodKey} to |
39 | * {@link org.eclipse.pde.api.tools.internal.provisional.descriptors.IFieldDescriptor} |
40 | */ |
41 | private Map fIllegalFields = new HashMap(); |
42 | |
43 | /** |
44 | * Map of {@link org.eclipse.pde.api.tools.internal.provisional.descriptors.IFieldDescriptor} |
45 | * to associated component IDs |
46 | */ |
47 | private Map fFieldComponents = new HashMap(); |
48 | |
49 | /** |
50 | * Adds the given type as not to be extended. |
51 | * |
52 | * @param field a field that is marked no reference |
53 | * @param componentId the component the type is located in |
54 | */ |
55 | void addIllegalField(IFieldDescriptor field, String componentId) { |
56 | fIllegalFields.put(new MethodKey(field.getEnclosingType().getQualifiedName(), field.getName()), field); |
57 | fFieldComponents.put(field, componentId); |
58 | } |
59 | |
60 | /* (non-Javadoc) |
61 | * @see org.eclipse.pde.api.tools.internal.provisional.search.IApiProblemDetector#considerReference(org.eclipse.pde.api.tools.internal.provisional.model.IReference) |
62 | */ |
63 | public boolean considerReference(IReference reference) { |
64 | if (fIllegalFields.containsKey(new MethodKey(reference.getReferencedTypeName(), reference.getReferencedMemberName()))) { |
65 | retainReference(reference); |
66 | return true; |
67 | } |
68 | return false; |
69 | } |
70 | |
71 | /* (non-Javadoc) |
72 | * @see org.eclipse.pde.api.tools.internal.provisional.search.IApiProblemDetector#getReferenceKinds() |
73 | */ |
74 | public int getReferenceKinds() { |
75 | return |
76 | IReference.REF_GETFIELD | |
77 | IReference.REF_GETSTATIC | |
78 | IReference.REF_PUTFIELD | |
79 | IReference.REF_PUTSTATIC; |
80 | } |
81 | |
82 | /* (non-Javadoc) |
83 | * @see org.eclipse.pde.api.tools.internal.search.AbstractProblemDetector#getProblemKind() |
84 | */ |
85 | protected int getProblemKind() { |
86 | return IApiProblem.ILLEGAL_REFERENCE; |
87 | } |
88 | |
89 | /* (non-Javadoc) |
90 | * @see org.eclipse.pde.api.tools.internal.search.AbstractProblemDetector#getSeverityKey() |
91 | */ |
92 | protected String getSeverityKey() { |
93 | return IApiProblemTypes.ILLEGAL_REFERENCE; |
94 | } |
95 | |
96 | /* (non-Javadoc) |
97 | * @see org.eclipse.pde.api.tools.internal.search.AbstractProblemDetector#getProblemFlags(org.eclipse.pde.api.tools.internal.provisional.model.IReference) |
98 | */ |
99 | protected int getProblemFlags(IReference reference) { |
100 | return IApiProblem.FIELD; |
101 | } |
102 | |
103 | /* (non-Javadoc) |
104 | * @see org.eclipse.pde.api.tools.internal.search.AbstractProblemDetector#getElementType(org.eclipse.pde.api.tools.internal.provisional.model.IReference) |
105 | */ |
106 | protected int getElementType(IReference reference) { |
107 | return IElementDescriptor.FIELD; |
108 | } |
109 | |
110 | /* (non-Javadoc) |
111 | * @see org.eclipse.pde.api.tools.internal.search.AbstractProblemDetector#getMessageArgs(org.eclipse.pde.api.tools.internal.provisional.model.IReference) |
112 | */ |
113 | protected String[] getMessageArgs(IReference reference) throws CoreException { |
114 | IApiField field = (IApiField) reference.getResolvedReference(); |
115 | return new String[] { |
116 | getSimpleTypeName(field), |
117 | getSimpleTypeName(reference.getMember()), |
118 | field.getName()}; |
119 | } |
120 | |
121 | /* (non-Javadoc) |
122 | * @see org.eclipse.pde.api.tools.internal.search.AbstractProblemDetector#getQualifiedMessageArgs(org.eclipse.pde.api.tools.internal.provisional.model.IReference) |
123 | */ |
124 | protected String[] getQualifiedMessageArgs(IReference reference) throws CoreException { |
125 | IApiField field = (IApiField) reference.getResolvedReference(); |
126 | return new String[] { |
127 | getQualifiedTypeName(field), |
128 | getQualifiedTypeName(reference.getMember()), |
129 | field.getName()}; |
130 | } |
131 | |
132 | /* (non-Javadoc) |
133 | * @see org.eclipse.pde.api.tools.internal.search.AbstractProblemDetector#getSourceRange(org.eclipse.jdt.core.IType, org.eclipse.jface.text.IDocument, org.eclipse.pde.api.tools.internal.provisional.model.IReference) |
134 | */ |
135 | protected Position getSourceRange(IType type, IDocument document, IReference reference) throws CoreException, BadLocationException { |
136 | return getFieldNameRange((IApiField) reference.getResolvedReference(), document, reference); |
137 | } |
138 | |
139 | /* (non-Javadoc) |
140 | * @see org.eclipse.pde.api.tools.internal.search.AbstractProblemDetector#isProblem(org.eclipse.pde.api.tools.internal.provisional.model.IReference) |
141 | */ |
142 | protected boolean isProblem(IReference reference) { |
143 | if(!super.isProblem(reference)) { |
144 | return false; |
145 | } |
146 | Object componentId = fFieldComponents.get(reference.getResolvedReference().getHandle()); |
147 | return componentId != null && reference.getResolvedReference().getApiComponent().getId().equals(componentId); |
148 | } |
149 | } |