1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package de.smartics.testdoc.core.source;
17
18 import javax.lang.model.element.Element;
19
20 import com.sun.source.tree.CompilationUnitTree;
21 import com.sun.source.tree.LineMap;
22 import com.sun.source.tree.Tree;
23 import com.sun.source.util.SourcePositions;
24 import com.sun.source.util.TreePath;
25 import com.sun.source.util.Trees;
26
27 import de.smartics.util.source.SourceCodeLocation;
28 import de.smartics.util.source.SourceCodeLocation.Position;
29
30
31
32
33
34
35
36
37 public class SunSourceCodeHelper implements SourceCodeHelper
38 {
39
40
41
42
43
44
45
46
47
48 private final Trees treeUtils;
49
50
51
52
53
54
55
56
57 public SunSourceCodeHelper(final Trees treeUtils)
58 {
59 this.treeUtils = treeUtils;
60 }
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 public SourceCodeLocation getSourceCodeLocation(final Element element)
79 {
80 final TreePath treePath = treeUtils.getPath(element);
81 if (treePath != null)
82 {
83 final CompilationUnitTree compileTree = treePath.getCompilationUnit();
84 final SourcePositions positions = treeUtils.getSourcePositions();
85 final Tree elementTree = treeUtils.getTree(element);
86 final long startPos =
87 positions.getStartPosition(compileTree, elementTree);
88 final long endPos = positions.getEndPosition(compileTree, elementTree);
89 final LineMap lines = compileTree.getLineMap();
90 return createLocation(lines, startPos, endPos);
91 }
92 else
93 {
94 return SourceCodeLocation.UNKNOWN_LOCATION;
95 }
96 }
97
98 private static SourceCodeLocation createLocation(final LineMap lines,
99 final long startPos, final long endPos)
100 {
101 final Position start = createPosition(lines, startPos);
102 final Position end = createPosition(lines, endPos);
103 final SourceCodeLocation location = new SourceCodeLocation(start, end);
104 return location;
105 }
106
107 private static Position createPosition(final LineMap lines, final long pos)
108 {
109 final long line = lines.getLineNumber(pos);
110 final long column = lines.getColumnNumber(pos);
111 return new Position(line, column);
112 }
113
114
115
116 }