EMMA Coverage Report (generated Thu Nov 26 15:54:18 CST 2009)
[all classes][org.eclipse.pde.api.tools.internal.builder]

COVERAGE SUMMARY FOR SOURCE FILE [LeakFieldProblemDetector.java]

nameclass, %method, %block, %line, %
LeakFieldProblemDetector.java100% (1/1)90%  (9/10)74%  (114/154)73%  (30/41)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class LeakFieldProblemDetector100% (1/1)90%  (9/10)74%  (114/154)73%  (30/41)
getQualifiedMessageArgs (IReference): String [] 0%   (0/1)0%   (0/28)0%   (0/6)
isProblem (IReference): boolean 100% (1/1)82%  (31/38)64%  (7/11)
getSourceRange (IType, IDocument, IReference): Position 100% (1/1)86%  (31/36)90%  (9/10)
LeakFieldProblemDetector (Set): void 100% (1/1)100% (4/4)100% (2/2)
getElementType (IReference): int 100% (1/1)100% (2/2)100% (1/1)
getMessageArgs (IReference): String [] 100% (1/1)100% (28/28)100% (6/6)
getProblemFlags (IReference): int 100% (1/1)100% (2/2)100% (1/1)
getReferenceKinds (): int 100% (1/1)100% (2/2)100% (1/1)
getSeverityKey (): String 100% (1/1)100% (2/2)100% (1/1)
isApplicable (IApiAnnotations): boolean 100% (1/1)100% (12/12)100% (2/2)

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 *******************************************************************************/
11package org.eclipse.pde.api.tools.internal.builder;
12 
13import java.util.Set;
14 
15import org.eclipse.core.runtime.CoreException;
16import org.eclipse.jdt.core.Flags;
17import org.eclipse.jdt.core.IField;
18import org.eclipse.jdt.core.ISourceRange;
19import org.eclipse.jdt.core.IType;
20import org.eclipse.jface.text.BadLocationException;
21import org.eclipse.jface.text.IDocument;
22import org.eclipse.jface.text.Position;
23import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin;
24import org.eclipse.pde.api.tools.internal.provisional.IApiAnnotations;
25import org.eclipse.pde.api.tools.internal.provisional.IApiDescription;
26import org.eclipse.pde.api.tools.internal.provisional.RestrictionModifiers;
27import org.eclipse.pde.api.tools.internal.provisional.builder.IReference;
28import org.eclipse.pde.api.tools.internal.provisional.descriptors.IElementDescriptor;
29import org.eclipse.pde.api.tools.internal.provisional.model.IApiField;
30import org.eclipse.pde.api.tools.internal.provisional.model.IApiType;
31import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblem;
32import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblemTypes;
33 
34/**
35 * Detects leaked field declarations (declared type).
36 * 
37 * @since 1.1
38 */
39public class LeakFieldProblemDetector extends AbstractTypeLeakDetector {
40        
41        /**
42         * @param nonApiPackageNames
43         */
44        public LeakFieldProblemDetector(Set nonApiPackageNames) {
45                super(nonApiPackageNames);
46        }
47 
48        /* (non-Javadoc)
49         * @see org.eclipse.pde.api.tools.internal.search.AbstractTypeLeakDetector#isApplicable(org.eclipse.pde.api.tools.internal.provisional.IApiAnnotations)
50         */
51        protected boolean isApplicable(IApiAnnotations annotations) {
52                return super.isApplicable(annotations) && 
53                        !RestrictionModifiers.isReferenceRestriction(annotations.getRestrictions());
54        }
55 
56        /* (non-Javadoc)
57         * @see org.eclipse.pde.api.tools.internal.provisional.search.IApiProblemDetector#getReferenceKinds()
58         */
59        public int getReferenceKinds() {
60                return IReference.REF_FIELDDECL;
61        }
62        
63        /* (non-Javadoc)
64         * @see org.eclipse.pde.api.tools.internal.search.AbstractProblemDetector#getElementType(org.eclipse.pde.api.tools.internal.provisional.model.IReference)
65         */
66        protected int getElementType(IReference reference) {
67                return IElementDescriptor.FIELD;
68        }
69        
70        /* (non-Javadoc)
71         * @see org.eclipse.pde.api.tools.internal.search.AbstractProblemDetector#getSeverityKey()
72         */
73        protected String getSeverityKey() {
74                return IApiProblemTypes.LEAK_FIELD_DECL;
75        }
76 
77        /* (non-Javadoc)
78         * @see org.eclipse.pde.api.tools.internal.search.AbstractProblemDetector#getProblemFlags(org.eclipse.pde.api.tools.internal.provisional.model.IReference)
79         */
80        protected int getProblemFlags(IReference reference) {
81                return IApiProblem.LEAK_FIELD;
82        }
83        
84        /* (non-Javadoc)
85         * @see org.eclipse.pde.api.tools.internal.search.AbstractTypeLeakDetector#isProblem(org.eclipse.pde.api.tools.internal.provisional.model.IReference)
86         */
87        protected boolean isProblem(IReference reference) {
88                if (super.isProblem(reference)) {
89                        IApiField field = (IApiField) reference.getMember();
90                        if ((Flags.AccProtected & field.getModifiers()) > 0) {
91                                // TODO: could do this check before resolution - it's a check on the source location
92                                // ignore protected members if contained in a @noextend type
93                                try {
94                                        IApiDescription description = field.getApiComponent().getApiDescription();
95                                        IApiAnnotations annotations = description.resolveAnnotations(field.getHandle().getEnclosingType());
96                                        if (annotations == null || RestrictionModifiers.isExtendRestriction(annotations.getRestrictions())) {
97                                                return false;
98                                        }
99                                } catch (CoreException e) {
100                                        ApiPlugin.log(e);
101                                }
102                        }
103                        return true;
104                }
105                return false;
106        }
107        
108        /* (non-Javadoc)
109         * @see org.eclipse.pde.api.tools.internal.search.AbstractTypeLeakDetector#getMessageArgs(org.eclipse.pde.api.tools.internal.provisional.model.IReference)
110         */
111        protected String[] getMessageArgs(IReference reference) throws CoreException {
112                IApiField field = (IApiField) reference.getMember();
113                IApiType type = (IApiType) reference.getResolvedReference();
114                return new String[] {
115                                getSimpleTypeName(type), 
116                                getSimpleTypeName(field), 
117                                field.getName()};
118        }
119        
120        /* (non-Javadoc)
121         * @see org.eclipse.pde.api.tools.internal.search.AbstractTypeLeakDetector#getQualifiedMessageArgs(org.eclipse.pde.api.tools.internal.provisional.model.IReference)
122         */
123        protected String[] getQualifiedMessageArgs(IReference reference) throws CoreException {
124                IApiField field = (IApiField) reference.getMember();
125                IApiType type = (IApiType) reference.getResolvedReference();
126                return new String[] {
127                                getQualifiedTypeName(type), 
128                                getQualifiedTypeName(field), 
129                                field.getName()};
130        }        
131        
132        /* (non-Javadoc)
133         * @see org.eclipse.pde.api.tools.internal.search.AbstractTypeLeakDetector#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 doc, IReference reference) throws CoreException, BadLocationException {
136                IApiField field = (IApiField) reference.getMember();
137                IField javaField = type.getField(field.getName());
138                Position pos = null;
139                if (javaField.exists()) {
140                        ISourceRange range = javaField.getNameRange();
141                        if(range != null) {
142                                pos = new Position(range.getOffset(), range.getLength()); 
143                        }
144                }
145                if(pos == null) {
146                        return defaultSourcePosition(type, reference);
147                }
148                return pos;
149        }
150}

[all classes][org.eclipse.pde.api.tools.internal.builder]
EMMA 2.0.5312 EclEmma Fix 1 (C) Vladimir Roubtsov