1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This program and the accompanying materials are made available under
4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the terms of the Common Public License v1.0 which accompanies this distribution,
5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and is available at http://www.eclipse.org/legal/cpl-v10.html
6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * $Id: SrcFileItem.java,v 1.1.1.1.2.1 2004/06/20 20:07:22 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.emma.report;
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.Iterator;
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.IntObjectMap;
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.asserts.$assert;
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.data.ClassDescriptor;
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.data.MethodDescriptor;
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectfinal class SrcFileItem extends Item
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final class LineCoverageData
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public static final int LINE_COVERAGE_ZERO = 0;
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public static final int LINE_COVERAGE_PARTIAL = 1;
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public static final int LINE_COVERAGE_COMPLETE = 2;
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public final int m_coverageStatus;
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public final int [/* units mode */][/* total, coverage */] m_coverageRatio; // not null in LINE_COVERAGE_PARTIAL status only]
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        LineCoverageData (final int coverageStatus, final int [][] coverageRatio)
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_coverageStatus = coverageStatus;
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_coverageRatio = coverageRatio;
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    } // end of nested class
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public SrcFileItem (final IItem parent, final String name, final String fullVMName)
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        super (parent);
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_name = name;
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_fullVMName = fullVMName;
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public String getName ()
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_name;
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public String getFullVMName ()
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_fullVMName;
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public int getFirstLine ()
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // TODO: state validation
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (m_firstLine == 0)
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            getAggregate (TOTAL_LINE_COUNT); // fault line coverage calculation
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_firstLine;
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public IntObjectMap /* line_no:int -> LineCoverageData */ getLineCoverage ()
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (m_lineCoverage == null)
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            getAggregate (TOTAL_LINE_COUNT); // fault line coverage calculation
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_lineCoverage;
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public int getAggregate (final int type)
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int [] aggregates = m_aggregates;
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        int value = aggregates [type];
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (value < 0)
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            switch (type)
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case COVERAGE_CLASS_COUNT:
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case    TOTAL_CLASS_COUNT:
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    aggregates [TOTAL_CLASS_COUNT] = getChildCount ();
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    value = 0;
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    for (Iterator children = getChildren (); children.hasNext (); )
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        // SF BUG 972725: this was incorrectly using 'type' instead
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        // of the COVERAGE_CLASS_COUNT aggregate type, making class
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        // coverage computation dependent on the order of how item
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        // nodes were traversed in report generators
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        value += ((IItem) children.next ()).getAggregate (COVERAGE_CLASS_COUNT);
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    aggregates [COVERAGE_CLASS_COUNT] = value;
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    return aggregates [type];
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                //break;
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case TOTAL_SRCFILE_COUNT:
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    return aggregates [TOTAL_SRCFILE_COUNT] = 1;
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                //break;
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case COVERAGE_LINE_COUNT:
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case    TOTAL_LINE_COUNT:
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case COVERAGE_LINE_INSTR:
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    // line aggregate types are special when used on srcfile items:
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    // unlike all others, they do not simply add up when the line
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    // info is available; instead, lines from all classes belonging
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    // to the same srcfile parent are set-merged
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    final IntObjectMap /* line -> int[2] */ fldata = new IntObjectMap ();
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    for (Iterator classes = getChildren (); classes.hasNext (); )
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final ClassItem cls = (ClassItem) classes.next ();
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final boolean [][] ccoverage = cls.getCoverage (); // this can be null
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final ClassDescriptor clsdesc = cls.getClassDescriptor ();
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final MethodDescriptor [] methoddescs = clsdesc.getMethods ();
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        for (Iterator methods = cls.getChildren (); methods.hasNext (); )
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        {
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            final MethodItem method = (MethodItem) methods.next ();
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            final int methodID = method.getID ();
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            final boolean [] mcoverage = ccoverage == null ? null : ccoverage [methodID];
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            final MethodDescriptor methoddesc = methoddescs [methodID];
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            final int [] mbsizes = methoddesc.getBlockSizes ();
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            final IntObjectMap mlineMap = methoddesc.getLineMap ();
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            if ($assert.ENABLED) $assert.ASSERT (mlineMap != null);
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            final int [] mlines = mlineMap.keys ();
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            for (int ml = 0, mlLimit = mlines.length; ml < mlLimit; ++ ml)
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            {
163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                final int mline = mlines [ml];
164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                int [] data = (int []) fldata.get (mline);
166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                if (data == null)
167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                {
168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                    data = new int [4]; // { totalcount, totalinstr, coveragecount, coverageinstr }
169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                    fldata.put (mline, data);
170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                }
171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                final int [] lblocks = (int []) mlineMap.get (mline);
173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                final int bCount = lblocks.length;
175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                data [0] += bCount;
176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                for (int bID = 0; bID < bCount; ++ bID)
178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                {
179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                    final int block = lblocks [bID];
180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                    final boolean bcovered = mcoverage != null && mcoverage [block];
182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                    final int instr = mbsizes [block];
183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                    data [1] += instr;
185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                    if (bcovered)
186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                    {
187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                        ++ data [2];
188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                        data [3] += instr;
189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                    }
190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                }
191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            }
192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        }
193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    final int lineCount = fldata.size ();
196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    aggregates [TOTAL_LINE_COUNT] = lineCount;
198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    int coverageLineCount = 0;
200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    int coverageLineInstr = 0;
201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    final IntObjectMap /* line_no:int -> LineCoverageData */ lineCoverage = new IntObjectMap (lineCount);
203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    int firstLine = Integer.MAX_VALUE;
204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    final int [] clines = fldata.keys ();
206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    for (int cl = 0; cl < lineCount; ++ cl)
208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final int cline = clines [cl];
210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final int [] data = (int []) fldata.get (cline);
211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final int ltotalCount = data [0];
213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final int ltotalInstr = data [1];
214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final int lcoverageCount = data [2];
215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final int lcoverageInstr = data [3];
216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        if (lcoverageInstr > 0)
218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        {
219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            coverageLineCount += (PRECISION * lcoverageCount) / ltotalCount;
220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            coverageLineInstr += (PRECISION * lcoverageInstr) / ltotalInstr;
221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        }
222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        // side effect: populate line coverage data map [used by getLineCoverage()]
224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final int lcoverageStatus;
226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        int [][] lcoverageRatio = null;
227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        if (lcoverageInstr == 0)
229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            lcoverageStatus = LineCoverageData.LINE_COVERAGE_ZERO;
230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        else if (lcoverageInstr == ltotalInstr)
231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            lcoverageStatus = LineCoverageData.LINE_COVERAGE_COMPLETE;
232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        else
233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        {
234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            lcoverageStatus = LineCoverageData.LINE_COVERAGE_PARTIAL;
235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            lcoverageRatio = new int [][] {{ltotalCount, lcoverageCount}, {ltotalInstr, lcoverageInstr}}; // note: ordering depends on IItemAttribute.UNITS_xxx
236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        }
237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        lineCoverage.put (cline, new LineCoverageData (lcoverageStatus, lcoverageRatio));
239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
240f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        // side effect: compute m_firstLine
241f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
242f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        if (cline < firstLine) firstLine = cline;
243f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
244f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
245f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    m_lineCoverage = lineCoverage; // side effect
246f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    m_firstLine = firstLine; // side effect
247f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
248f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    aggregates [COVERAGE_LINE_COUNT] = coverageLineCount;
249f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    aggregates [COVERAGE_LINE_INSTR] = coverageLineInstr;
250f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
251f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    return aggregates [type];
252f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
253f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                //break;
254f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
255f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
256f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                default: return super.getAggregate (type);
257f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
258f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
259f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
260f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return value;
261f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
262f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
263f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
264f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void accept (final IItemVisitor visitor, final Object ctx)
265f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
266f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        visitor.visit (this, ctx);
267f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
268f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
269f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final IItemMetadata getMetadata ()
270f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
271f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return METADATA;
272f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
273f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
274f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static IItemMetadata getTypeMetadata ()
275f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
276f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return METADATA;
277f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
278f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
279f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
280f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
281f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
282f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
283f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
284f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
285f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
286f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final String m_name, m_fullVMName;
287f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private IntObjectMap /* line_no:int -> LineCoverageData */ m_lineCoverage;
288f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private int m_firstLine;
289f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
290f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static final Item.ItemMetadata METADATA; // set in <clinit>
291f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
292f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static
293f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
294f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        METADATA = new Item.ItemMetadata (IItemMetadata.TYPE_ID_SRCFILE, "srcfile",
295f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            1 << IItemAttribute.ATTRIBUTE_NAME_ID |
296f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            1 << IItemAttribute.ATTRIBUTE_CLASS_COVERAGE_ID |
297f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            1 << IItemAttribute.ATTRIBUTE_METHOD_COVERAGE_ID |
298f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            1 << IItemAttribute.ATTRIBUTE_BLOCK_COVERAGE_ID |
299f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            1 << IItemAttribute.ATTRIBUTE_LINE_COVERAGE_ID);
300f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
301f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
302f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
303f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------