Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java
38899 views
1
/*
2
* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
package com.sun.tools.javadoc;
27
28
import java.lang.reflect.Modifier;
29
import java.util.*;
30
31
import javax.tools.JavaFileManager;
32
33
import com.sun.javadoc.*;
34
import com.sun.source.util.JavacTask;
35
import com.sun.source.util.TreePath;
36
import com.sun.tools.doclint.DocLint;
37
import com.sun.tools.javac.api.BasicJavacTask;
38
import com.sun.tools.javac.code.*;
39
import com.sun.tools.javac.code.Symbol.*;
40
import com.sun.tools.javac.code.Type.ClassType;
41
import com.sun.tools.javac.comp.Check;
42
import com.sun.tools.javac.file.JavacFileManager;
43
import com.sun.tools.javac.tree.JCTree;
44
import com.sun.tools.javac.tree.JCTree.*;
45
import com.sun.tools.javac.util.Context;
46
import com.sun.tools.javac.util.Names;
47
48
/**
49
* Holds the environment for a run of javadoc.
50
* Holds only the information needed throughout the
51
* run and not the compiler info that could be GC'ed
52
* or ported.
53
*
54
* <p><b>This is NOT part of any supported API.
55
* If you write code that depends on this, you do so at your own risk.
56
* This code and its internal interfaces are subject to change or
57
* deletion without notice.</b>
58
*
59
* @since 1.4
60
* @author Robert Field
61
* @author Neal Gafter (rewrite)
62
* @author Scott Seligman (generics)
63
*/
64
public class DocEnv {
65
protected static final Context.Key<DocEnv> docEnvKey =
66
new Context.Key<DocEnv>();
67
68
public static DocEnv instance(Context context) {
69
DocEnv instance = context.get(docEnvKey);
70
if (instance == null)
71
instance = new DocEnv(context);
72
return instance;
73
}
74
75
private Messager messager;
76
77
DocLocale doclocale;
78
79
/** Predefined symbols known to the compiler. */
80
Symtab syms;
81
82
/** Referenced directly in RootDocImpl. */
83
JavadocClassReader reader;
84
85
/** Javadoc's own version of the compiler's enter phase. */
86
JavadocEnter enter;
87
88
/** The name table. */
89
private final Names names;
90
91
/** The encoding name. */
92
private String encoding;
93
94
final Symbol externalizableSym;
95
96
/** Access filter (public, protected, ...). */
97
protected ModifierFilter showAccess;
98
99
/** True if we are using a sentence BreakIterator. */
100
boolean breakiterator;
101
102
/**
103
* True if we do not want to print any notifications at all.
104
*/
105
boolean quiet = false;
106
107
Check chk;
108
Types types;
109
JavaFileManager fileManager;
110
Context context;
111
DocLint doclint;
112
JavaScriptScanner javaScriptScanner;
113
114
WeakHashMap<JCTree, TreePath> treePaths = new WeakHashMap<JCTree, TreePath>();
115
116
/** Allow documenting from class files? */
117
boolean docClasses = false;
118
119
/** Does the doclet only expect pre-1.5 doclet API? */
120
protected boolean legacyDoclet = true;
121
122
/**
123
* Set this to true if you would like to not emit any errors, warnings and
124
* notices.
125
*/
126
private boolean silent = false;
127
128
/**
129
* The source language version.
130
*/
131
protected Source source;
132
133
/**
134
* Constructor
135
*
136
* @param context Context for this javadoc instance.
137
*/
138
protected DocEnv(Context context) {
139
context.put(docEnvKey, this);
140
this.context = context;
141
142
messager = Messager.instance0(context);
143
syms = Symtab.instance(context);
144
reader = JavadocClassReader.instance0(context);
145
enter = JavadocEnter.instance0(context);
146
names = Names.instance(context);
147
externalizableSym = reader.enterClass(names.fromString("java.io.Externalizable"));
148
chk = Check.instance(context);
149
types = Types.instance(context);
150
fileManager = context.get(JavaFileManager.class);
151
if (fileManager instanceof JavacFileManager) {
152
((JavacFileManager)fileManager).setSymbolFileEnabled(false);
153
}
154
155
// Default. Should normally be reset with setLocale.
156
this.doclocale = new DocLocale(this, "", breakiterator);
157
source = Source.instance(context);
158
}
159
160
public void setSilent(boolean silent) {
161
this.silent = silent;
162
}
163
164
/**
165
* Look up ClassDoc by qualified name.
166
*/
167
public ClassDocImpl lookupClass(String name) {
168
ClassSymbol c = getClassSymbol(name);
169
if (c != null) {
170
return getClassDoc(c);
171
} else {
172
return null;
173
}
174
}
175
176
/**
177
* Load ClassDoc by qualified name.
178
*/
179
public ClassDocImpl loadClass(String name) {
180
try {
181
ClassSymbol c = reader.loadClass(names.fromString(name));
182
return getClassDoc(c);
183
} catch (CompletionFailure ex) {
184
chk.completionError(null, ex);
185
return null;
186
}
187
}
188
189
/**
190
* Look up PackageDoc by qualified name.
191
*/
192
public PackageDocImpl lookupPackage(String name) {
193
//### Jing alleges that class check is needed
194
//### to avoid a compiler bug. Most likely
195
//### instead a dummy created for error recovery.
196
//### Should investigate this.
197
PackageSymbol p = syms.packages.get(names.fromString(name));
198
ClassSymbol c = getClassSymbol(name);
199
if (p != null && c == null) {
200
return getPackageDoc(p);
201
} else {
202
return null;
203
}
204
}
205
// where
206
/** Retrieve class symbol by fully-qualified name.
207
*/
208
ClassSymbol getClassSymbol(String name) {
209
// Name may contain nested class qualification.
210
// Generate candidate flatnames with successively shorter
211
// package qualifiers and longer nested class qualifiers.
212
int nameLen = name.length();
213
char[] nameChars = name.toCharArray();
214
int idx = name.length();
215
for (;;) {
216
ClassSymbol s = syms.classes.get(names.fromChars(nameChars, 0, nameLen));
217
if (s != null)
218
return s; // found it!
219
idx = name.substring(0, idx).lastIndexOf('.');
220
if (idx < 0) break;
221
nameChars[idx] = '$';
222
}
223
return null;
224
}
225
226
/**
227
* Set the locale.
228
*/
229
public void setLocale(String localeName) {
230
// create locale specifics
231
doclocale = new DocLocale(this, localeName, breakiterator);
232
// update Messager if locale has changed.
233
messager.setLocale(doclocale.locale);
234
}
235
236
/** Check whether this member should be documented. */
237
public boolean shouldDocument(VarSymbol sym) {
238
long mod = sym.flags();
239
240
if ((mod & Flags.SYNTHETIC) != 0) {
241
return false;
242
}
243
244
return showAccess.checkModifier(translateModifiers(mod));
245
}
246
247
/** Check whether this member should be documented. */
248
public boolean shouldDocument(MethodSymbol sym) {
249
long mod = sym.flags();
250
251
if ((mod & Flags.SYNTHETIC) != 0) {
252
return false;
253
}
254
255
return showAccess.checkModifier(translateModifiers(mod));
256
}
257
258
/** check whether this class should be documented. */
259
public boolean shouldDocument(ClassSymbol sym) {
260
return
261
(sym.flags_field&Flags.SYNTHETIC) == 0 && // no synthetics
262
(docClasses || getClassDoc(sym).tree != null) &&
263
isVisible(sym);
264
}
265
266
//### Comment below is inaccurate wrt modifier filter testing
267
/**
268
* Check the visibility if this is an nested class.
269
* if this is not a nested class, return true.
270
* if this is an static visible nested class,
271
* return true.
272
* if this is an visible nested class
273
* if the outer class is visible return true.
274
* else return false.
275
* IMPORTANT: This also allows, static nested classes
276
* to be defined inside an nested class, which is not
277
* allowed by the compiler. So such an test case will
278
* not reach upto this method itself, but if compiler
279
* allows it, then that will go through.
280
*/
281
protected boolean isVisible(ClassSymbol sym) {
282
long mod = sym.flags_field;
283
if (!showAccess.checkModifier(translateModifiers(mod))) {
284
return false;
285
}
286
ClassSymbol encl = sym.owner.enclClass();
287
return (encl == null || (mod & Flags.STATIC) != 0 || isVisible(encl));
288
}
289
290
//---------------- print forwarders ----------------//
291
292
/**
293
* Print error message, increment error count.
294
*
295
* @param msg message to print.
296
*/
297
public void printError(String msg) {
298
if (silent)
299
return;
300
messager.printError(msg);
301
}
302
303
/**
304
* Print error message, increment error count.
305
*
306
* @param key selects message from resource
307
*/
308
public void error(DocImpl doc, String key) {
309
if (silent)
310
return;
311
messager.error(doc==null ? null : doc.position(), key);
312
}
313
314
/**
315
* Print error message, increment error count.
316
*
317
* @param key selects message from resource
318
*/
319
public void error(SourcePosition pos, String key) {
320
if (silent)
321
return;
322
messager.error(pos, key);
323
}
324
325
/**
326
* Print error message, increment error count.
327
*
328
* @param msg message to print.
329
*/
330
public void printError(SourcePosition pos, String msg) {
331
if (silent)
332
return;
333
messager.printError(pos, msg);
334
}
335
336
/**
337
* Print error message, increment error count.
338
*
339
* @param key selects message from resource
340
* @param a1 first argument
341
*/
342
public void error(DocImpl doc, String key, String a1) {
343
if (silent)
344
return;
345
messager.error(doc==null ? null : doc.position(), key, a1);
346
}
347
348
/**
349
* Print error message, increment error count.
350
*
351
* @param key selects message from resource
352
* @param a1 first argument
353
* @param a2 second argument
354
*/
355
public void error(DocImpl doc, String key, String a1, String a2) {
356
if (silent)
357
return;
358
messager.error(doc==null ? null : doc.position(), key, a1, a2);
359
}
360
361
/**
362
* Print error message, increment error count.
363
*
364
* @param key selects message from resource
365
* @param a1 first argument
366
* @param a2 second argument
367
* @param a3 third argument
368
*/
369
public void error(DocImpl doc, String key, String a1, String a2, String a3) {
370
if (silent)
371
return;
372
messager.error(doc==null ? null : doc.position(), key, a1, a2, a3);
373
}
374
375
/**
376
* Print warning message, increment warning count.
377
*
378
* @param msg message to print.
379
*/
380
public void printWarning(String msg) {
381
if (silent)
382
return;
383
messager.printWarning(msg);
384
}
385
386
/**
387
* Print warning message, increment warning count.
388
*
389
* @param key selects message from resource
390
*/
391
public void warning(DocImpl doc, String key) {
392
if (silent)
393
return;
394
messager.warning(doc==null ? null : doc.position(), key);
395
}
396
397
/**
398
* Print warning message, increment warning count.
399
*
400
* @param msg message to print.
401
*/
402
public void printWarning(SourcePosition pos, String msg) {
403
if (silent)
404
return;
405
messager.printWarning(pos, msg);
406
}
407
408
/**
409
* Print warning message, increment warning count.
410
*
411
* @param key selects message from resource
412
* @param a1 first argument
413
*/
414
public void warning(DocImpl doc, String key, String a1) {
415
if (silent)
416
return;
417
// suppress messages that have (probably) been covered by doclint
418
if (doclint != null && doc != null && key.startsWith("tag"))
419
return;
420
messager.warning(doc==null ? null : doc.position(), key, a1);
421
}
422
423
/**
424
* Print warning message, increment warning count.
425
*
426
* @param key selects message from resource
427
* @param a1 first argument
428
* @param a2 second argument
429
*/
430
public void warning(DocImpl doc, String key, String a1, String a2) {
431
if (silent)
432
return;
433
messager.warning(doc==null ? null : doc.position(), key, a1, a2);
434
}
435
436
/**
437
* Print warning message, increment warning count.
438
*
439
* @param key selects message from resource
440
* @param a1 first argument
441
* @param a2 second argument
442
* @param a3 third argument
443
*/
444
public void warning(DocImpl doc, String key, String a1, String a2, String a3) {
445
if (silent)
446
return;
447
messager.warning(doc==null ? null : doc.position(), key, a1, a2, a3);
448
}
449
450
/**
451
* Print warning message, increment warning count.
452
*
453
* @param key selects message from resource
454
* @param a1 first argument
455
* @param a2 second argument
456
* @param a3 third argument
457
*/
458
public void warning(DocImpl doc, String key, String a1, String a2, String a3,
459
String a4) {
460
if (silent)
461
return;
462
messager.warning(doc==null ? null : doc.position(), key, a1, a2, a3, a4);
463
}
464
465
/**
466
* Print a message.
467
*
468
* @param msg message to print.
469
*/
470
public void printNotice(String msg) {
471
if (silent || quiet)
472
return;
473
messager.printNotice(msg);
474
}
475
476
477
/**
478
* Print a message.
479
*
480
* @param key selects message from resource
481
*/
482
public void notice(String key) {
483
if (silent || quiet)
484
return;
485
messager.notice(key);
486
}
487
488
/**
489
* Print a message.
490
*
491
* @param msg message to print.
492
*/
493
public void printNotice(SourcePosition pos, String msg) {
494
if (silent || quiet)
495
return;
496
messager.printNotice(pos, msg);
497
}
498
499
/**
500
* Print a message.
501
*
502
* @param key selects message from resource
503
* @param a1 first argument
504
*/
505
public void notice(String key, String a1) {
506
if (silent || quiet)
507
return;
508
messager.notice(key, a1);
509
}
510
511
/**
512
* Print a message.
513
*
514
* @param key selects message from resource
515
* @param a1 first argument
516
* @param a2 second argument
517
*/
518
public void notice(String key, String a1, String a2) {
519
if (silent || quiet)
520
return;
521
messager.notice(key, a1, a2);
522
}
523
524
/**
525
* Print a message.
526
*
527
* @param key selects message from resource
528
* @param a1 first argument
529
* @param a2 second argument
530
* @param a3 third argument
531
*/
532
public void notice(String key, String a1, String a2, String a3) {
533
if (silent || quiet)
534
return;
535
messager.notice(key, a1, a2, a3);
536
}
537
538
/**
539
* Exit, reporting errors and warnings.
540
*/
541
public void exit() {
542
// Messager should be replaced by a more general
543
// compilation environment. This can probably
544
// subsume DocEnv as well.
545
messager.exit();
546
}
547
548
protected Map<PackageSymbol, PackageDocImpl> packageMap =
549
new HashMap<PackageSymbol, PackageDocImpl>();
550
/**
551
* Return the PackageDoc of this package symbol.
552
*/
553
public PackageDocImpl getPackageDoc(PackageSymbol pack) {
554
PackageDocImpl result = packageMap.get(pack);
555
if (result != null) return result;
556
result = new PackageDocImpl(this, pack);
557
packageMap.put(pack, result);
558
return result;
559
}
560
561
/**
562
* Create the PackageDoc (or a subtype) for a package symbol.
563
*/
564
void makePackageDoc(PackageSymbol pack, TreePath treePath) {
565
PackageDocImpl result = packageMap.get(pack);
566
if (result != null) {
567
if (treePath != null) result.setTreePath(treePath);
568
} else {
569
result = new PackageDocImpl(this, pack, treePath);
570
packageMap.put(pack, result);
571
}
572
}
573
574
575
protected Map<ClassSymbol, ClassDocImpl> classMap =
576
new HashMap<ClassSymbol, ClassDocImpl>();
577
/**
578
* Return the ClassDoc (or a subtype) of this class symbol.
579
*/
580
public ClassDocImpl getClassDoc(ClassSymbol clazz) {
581
ClassDocImpl result = classMap.get(clazz);
582
if (result != null) return result;
583
if (isAnnotationType(clazz)) {
584
result = new AnnotationTypeDocImpl(this, clazz);
585
} else {
586
result = new ClassDocImpl(this, clazz);
587
}
588
classMap.put(clazz, result);
589
return result;
590
}
591
592
/**
593
* Create the ClassDoc (or a subtype) for a class symbol.
594
*/
595
protected void makeClassDoc(ClassSymbol clazz, TreePath treePath) {
596
ClassDocImpl result = classMap.get(clazz);
597
if (result != null) {
598
if (treePath != null) result.setTreePath(treePath);
599
return;
600
}
601
if (isAnnotationType((JCClassDecl) treePath.getLeaf())) { // flags of clazz may not yet be set
602
result = new AnnotationTypeDocImpl(this, clazz, treePath);
603
} else {
604
result = new ClassDocImpl(this, clazz, treePath);
605
}
606
classMap.put(clazz, result);
607
}
608
609
protected static boolean isAnnotationType(ClassSymbol clazz) {
610
return ClassDocImpl.isAnnotationType(clazz);
611
}
612
613
protected static boolean isAnnotationType(JCClassDecl tree) {
614
return (tree.mods.flags & Flags.ANNOTATION) != 0;
615
}
616
617
protected Map<VarSymbol, FieldDocImpl> fieldMap =
618
new HashMap<VarSymbol, FieldDocImpl>();
619
/**
620
* Return the FieldDoc of this var symbol.
621
*/
622
public FieldDocImpl getFieldDoc(VarSymbol var) {
623
FieldDocImpl result = fieldMap.get(var);
624
if (result != null) return result;
625
result = new FieldDocImpl(this, var);
626
fieldMap.put(var, result);
627
return result;
628
}
629
/**
630
* Create a FieldDoc for a var symbol.
631
*/
632
protected void makeFieldDoc(VarSymbol var, TreePath treePath) {
633
FieldDocImpl result = fieldMap.get(var);
634
if (result != null) {
635
if (treePath != null) result.setTreePath(treePath);
636
} else {
637
result = new FieldDocImpl(this, var, treePath);
638
fieldMap.put(var, result);
639
}
640
}
641
642
protected Map<MethodSymbol, ExecutableMemberDocImpl> methodMap =
643
new HashMap<MethodSymbol, ExecutableMemberDocImpl>();
644
/**
645
* Create a MethodDoc for this MethodSymbol.
646
* Should be called only on symbols representing methods.
647
*/
648
protected void makeMethodDoc(MethodSymbol meth, TreePath treePath) {
649
MethodDocImpl result = (MethodDocImpl)methodMap.get(meth);
650
if (result != null) {
651
if (treePath != null) result.setTreePath(treePath);
652
} else {
653
result = new MethodDocImpl(this, meth, treePath);
654
methodMap.put(meth, result);
655
}
656
}
657
658
/**
659
* Return the MethodDoc for a MethodSymbol.
660
* Should be called only on symbols representing methods.
661
*/
662
public MethodDocImpl getMethodDoc(MethodSymbol meth) {
663
assert !meth.isConstructor() : "not expecting a constructor symbol";
664
MethodDocImpl result = (MethodDocImpl)methodMap.get(meth);
665
if (result != null) return result;
666
result = new MethodDocImpl(this, meth);
667
methodMap.put(meth, result);
668
return result;
669
}
670
671
/**
672
* Create the ConstructorDoc for a MethodSymbol.
673
* Should be called only on symbols representing constructors.
674
*/
675
protected void makeConstructorDoc(MethodSymbol meth, TreePath treePath) {
676
ConstructorDocImpl result = (ConstructorDocImpl)methodMap.get(meth);
677
if (result != null) {
678
if (treePath != null) result.setTreePath(treePath);
679
} else {
680
result = new ConstructorDocImpl(this, meth, treePath);
681
methodMap.put(meth, result);
682
}
683
}
684
685
/**
686
* Return the ConstructorDoc for a MethodSymbol.
687
* Should be called only on symbols representing constructors.
688
*/
689
public ConstructorDocImpl getConstructorDoc(MethodSymbol meth) {
690
assert meth.isConstructor() : "expecting a constructor symbol";
691
ConstructorDocImpl result = (ConstructorDocImpl)methodMap.get(meth);
692
if (result != null) return result;
693
result = new ConstructorDocImpl(this, meth);
694
methodMap.put(meth, result);
695
return result;
696
}
697
698
/**
699
* Create the AnnotationTypeElementDoc for a MethodSymbol.
700
* Should be called only on symbols representing annotation type elements.
701
*/
702
protected void makeAnnotationTypeElementDoc(MethodSymbol meth, TreePath treePath) {
703
AnnotationTypeElementDocImpl result =
704
(AnnotationTypeElementDocImpl)methodMap.get(meth);
705
if (result != null) {
706
if (treePath != null) result.setTreePath(treePath);
707
} else {
708
result =
709
new AnnotationTypeElementDocImpl(this, meth, treePath);
710
methodMap.put(meth, result);
711
}
712
}
713
714
/**
715
* Return the AnnotationTypeElementDoc for a MethodSymbol.
716
* Should be called only on symbols representing annotation type elements.
717
*/
718
public AnnotationTypeElementDocImpl getAnnotationTypeElementDoc(
719
MethodSymbol meth) {
720
721
AnnotationTypeElementDocImpl result =
722
(AnnotationTypeElementDocImpl)methodMap.get(meth);
723
if (result != null) return result;
724
result = new AnnotationTypeElementDocImpl(this, meth);
725
methodMap.put(meth, result);
726
return result;
727
}
728
729
// private Map<ClassType, ParameterizedTypeImpl> parameterizedTypeMap =
730
// new HashMap<ClassType, ParameterizedTypeImpl>();
731
/**
732
* Return the ParameterizedType of this instantiation.
733
// * ### Could use Type.sameTypeAs() instead of equality matching in hashmap
734
// * ### to avoid some duplication.
735
*/
736
ParameterizedTypeImpl getParameterizedType(ClassType t) {
737
return new ParameterizedTypeImpl(this, t);
738
// ParameterizedTypeImpl result = parameterizedTypeMap.get(t);
739
// if (result != null) return result;
740
// result = new ParameterizedTypeImpl(this, t);
741
// parameterizedTypeMap.put(t, result);
742
// return result;
743
}
744
745
TreePath getTreePath(JCCompilationUnit tree) {
746
TreePath p = treePaths.get(tree);
747
if (p == null)
748
treePaths.put(tree, p = new TreePath(tree));
749
return p;
750
}
751
752
TreePath getTreePath(JCCompilationUnit toplevel, JCClassDecl tree) {
753
TreePath p = treePaths.get(tree);
754
if (p == null)
755
treePaths.put(tree, p = new TreePath(getTreePath(toplevel), tree));
756
return p;
757
}
758
759
TreePath getTreePath(JCCompilationUnit toplevel, JCClassDecl cdecl, JCTree tree) {
760
return new TreePath(getTreePath(toplevel, cdecl), tree);
761
}
762
763
/**
764
* Set the encoding.
765
*/
766
public void setEncoding(String encoding) {
767
this.encoding = encoding;
768
}
769
770
/**
771
* Get the encoding.
772
*/
773
public String getEncoding() {
774
return encoding;
775
}
776
777
/**
778
* Convert modifier bits from private coding used by
779
* the compiler to that of java.lang.reflect.Modifier.
780
*/
781
static int translateModifiers(long flags) {
782
int result = 0;
783
if ((flags & Flags.ABSTRACT) != 0)
784
result |= Modifier.ABSTRACT;
785
if ((flags & Flags.FINAL) != 0)
786
result |= Modifier.FINAL;
787
if ((flags & Flags.INTERFACE) != 0)
788
result |= Modifier.INTERFACE;
789
if ((flags & Flags.NATIVE) != 0)
790
result |= Modifier.NATIVE;
791
if ((flags & Flags.PRIVATE) != 0)
792
result |= Modifier.PRIVATE;
793
if ((flags & Flags.PROTECTED) != 0)
794
result |= Modifier.PROTECTED;
795
if ((flags & Flags.PUBLIC) != 0)
796
result |= Modifier.PUBLIC;
797
if ((flags & Flags.STATIC) != 0)
798
result |= Modifier.STATIC;
799
if ((flags & Flags.SYNCHRONIZED) != 0)
800
result |= Modifier.SYNCHRONIZED;
801
if ((flags & Flags.TRANSIENT) != 0)
802
result |= Modifier.TRANSIENT;
803
if ((flags & Flags.VOLATILE) != 0)
804
result |= Modifier.VOLATILE;
805
return result;
806
}
807
808
void initDoclint(Collection<String> opts, Collection<String> customTagNames) {
809
ArrayList<String> doclintOpts = new ArrayList<String>();
810
811
for (String opt: opts) {
812
doclintOpts.add(opt == null ? DocLint.XMSGS_OPTION : DocLint.XMSGS_CUSTOM_PREFIX + opt);
813
}
814
815
if (doclintOpts.isEmpty()) {
816
doclintOpts.add(DocLint.XMSGS_OPTION);
817
} else if (doclintOpts.size() == 1
818
&& doclintOpts.get(0).equals(DocLint.XMSGS_CUSTOM_PREFIX + "none")) {
819
return;
820
}
821
822
String sep = "";
823
StringBuilder customTags = new StringBuilder();
824
for (String customTag : customTagNames) {
825
customTags.append(sep);
826
customTags.append(customTag);
827
sep = DocLint.TAGS_SEPARATOR;
828
}
829
doclintOpts.add(DocLint.XCUSTOM_TAGS_PREFIX + customTags.toString());
830
831
JavacTask t = BasicJavacTask.instance(context);
832
doclint = new DocLint();
833
// standard doclet normally generates H1, H2
834
doclintOpts.add(DocLint.XIMPLICIT_HEADERS + "2");
835
doclint.init(t, doclintOpts.toArray(new String[doclintOpts.size()]), false);
836
}
837
838
JavaScriptScanner initJavaScriptScanner(boolean allowScriptInComments) {
839
if (allowScriptInComments) {
840
javaScriptScanner = null;
841
} else {
842
javaScriptScanner = new JavaScriptScanner();
843
}
844
return javaScriptScanner;
845
}
846
847
boolean showTagMessages() {
848
return (doclint == null);
849
}
850
}
851
852