1
+ package javaxt .utils .src ;
2
+
3
+ import java .util .*;
4
+ import javax .lang .model .SourceVersion ;
5
+ import jdk .javadoc .doclet .Reporter ;
6
+ import jdk .javadoc .doclet .DocletEnvironment ;
7
+
8
+
9
+ //******************************************************************************
10
+ //** Doclet Class
11
+ //******************************************************************************
12
+ /**
13
+ * Custom doclet implementation that uses the Parser class instead of the
14
+ * native java libraries to parse source files.
15
+ *
16
+ ******************************************************************************/
17
+
18
+ public class Doclet implements jdk .javadoc .doclet .Doclet {
19
+ private String fileName ;
20
+ private String directory ;
21
+
22
+ private boolean processArg (String opt , List <String > arguments ){
23
+ if (opt .equals ("-d" )) directory = arguments .get (0 );
24
+ if (opt .equals ("-filename" )) fileName = arguments .get (0 );
25
+ return true ;
26
+ }
27
+
28
+
29
+ @ Override
30
+ public void init (Locale locale , Reporter reporter ) {
31
+ }
32
+
33
+ @ Override
34
+ public boolean run (DocletEnvironment docEnv ) {
35
+ //System.out.println("directory: " + directory);
36
+ //System.out.println("fileName: " + fileName);
37
+
38
+
39
+ HashSet <javaxt .io .File > files = new HashSet <>();
40
+ Iterator it = docEnv .getIncludedElements ().iterator ();
41
+ while (it .hasNext ()){
42
+ Object obj = it .next (); //com.sun.tools.javac.code.Symbol$ClassSymbol
43
+
44
+ //Get classname
45
+ String className = obj .toString ();
46
+
47
+
48
+ //Get path
49
+ String path = null ;
50
+ try {
51
+ java .lang .reflect .Field field ;
52
+ Object f ;
53
+
54
+ //Get sourcefile (DirectoryFileObject)
55
+ Object sourceFile = getFieldValue ("sourcefile" , obj );
56
+ //System.out.println("sourcefile: " + sourceFile);
57
+
58
+
59
+ //Get base path
60
+ Object basePath = getFieldValue ("userPackageRootDir" , sourceFile );
61
+ //System.out.println("userPackageRootDir: " + basePath);
62
+ javaxt .io .Directory dir = new javaxt .io .Directory (basePath .toString ());
63
+
64
+
65
+ //Get relative path
66
+ Object relativePath = getFieldValue ("relativePath" , sourceFile );
67
+ //System.out.println("relativePath: " + relativePath);
68
+ field = relativePath .getClass ().getSuperclass ().getDeclaredField ("path" );
69
+ field .setAccessible (true );
70
+ f = field .get (relativePath );
71
+ //System.out.println("path: " + f);
72
+ path = dir + f .toString ();
73
+ files .add (new javaxt .io .File (path ));
74
+ }
75
+ catch (Throwable e ){
76
+ }
77
+
78
+
79
+ // if (path!=null){
80
+ // System.out.println(className);
81
+ // System.out.println("path: " + path);
82
+ // System.out.println();
83
+ // }
84
+ }
85
+
86
+ for (javaxt .io .File file : files ){
87
+ //System.out.println(file);
88
+ try {
89
+
90
+ ArrayList <Class > classes = new Parser (file ).getClasses ();
91
+ for (Class c : classes ){
92
+ //System.out.println(" - " + c.getName());
93
+ }
94
+ }
95
+ catch (Exception e ){
96
+ System .err .println ("Failed to parse " + file .getName (false ));
97
+ }
98
+ }
99
+
100
+ return true ;
101
+ }
102
+
103
+
104
+ private Object getFieldValue (String fieldName , Object obj ) throws Exception {
105
+ java .lang .reflect .Field field ;
106
+ field = obj .getClass ().getDeclaredField (fieldName );
107
+ field .setAccessible (true );
108
+ return field .get (obj );
109
+ }
110
+
111
+ @ Override
112
+ public String getName () {
113
+ return "JavaXT Doclet" ;
114
+ }
115
+
116
+ @ Override
117
+ public SourceVersion getSupportedSourceVersion () {
118
+ return SourceVersion .latest ();
119
+ }
120
+
121
+ @ Override
122
+ public Set <? extends Option > getSupportedOptions () {
123
+ HashSet <Option > options = new HashSet <>();
124
+ options .add (createOption ("-filename" ));
125
+ options .add (createOption ("-d" ));
126
+ return options ;
127
+ }
128
+
129
+ private Option createOption (String key ){
130
+ return new Option () {
131
+ private final List <String > keys = Arrays .asList (
132
+ key
133
+ );
134
+
135
+ @ Override
136
+ public int getArgumentCount () {
137
+ return 1 ;
138
+ }
139
+
140
+ @ Override
141
+ public String getDescription () {
142
+ return "an option with aliases" ;
143
+ }
144
+
145
+ @ Override
146
+ public Option .Kind getKind () {
147
+ return Option .Kind .STANDARD ;
148
+ }
149
+
150
+ @ Override
151
+ public List <String > getNames () {
152
+ return keys ;
153
+ }
154
+
155
+ @ Override
156
+ public String getParameters () {
157
+ return "file" ;
158
+ }
159
+
160
+ @ Override
161
+ public boolean process (String opt , List <String > arguments ) {
162
+ return processArg (opt , arguments );
163
+ }
164
+ };
165
+ }
166
+ }
0 commit comments