Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/langtools/jdk/javadoc/tool/modules/Modules.java
40974 views
1
/*
2
* Copyright (c) 2016, 2021, 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.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*/
23
24
/*
25
* @test
26
* @bug 8159305 8166127 8175860 8176481 8239575
27
* @summary Tests primarily the module graph computations.
28
* @modules
29
* jdk.javadoc/jdk.javadoc.internal.api
30
* jdk.javadoc/jdk.javadoc.internal.tool
31
* jdk.compiler/com.sun.tools.javac.api
32
* jdk.compiler/com.sun.tools.javac.main
33
* @library /tools/lib
34
* @build toolbox.ToolBox toolbox.TestRunner
35
* @run main Modules
36
*/
37
38
import java.io.IOException;
39
import java.nio.file.Files;
40
import java.nio.file.Path;
41
import java.nio.file.Paths;
42
43
import toolbox.*;
44
import toolbox.Task.Expect;
45
import toolbox.Task.OutputKind;
46
47
public class Modules extends ModuleTestBase {
48
49
public static void main(String... args) throws Exception {
50
new Modules().runTests();
51
}
52
53
@Test
54
public void testBasicMoption(Path base) throws Exception {
55
Files.createDirectory(base);
56
Path src = base.resolve("src");
57
ModuleBuilder mb = new ModuleBuilder(tb, "m1");
58
mb.comment("The first module.")
59
.exports("pub")
60
.classes("package pub; /** Class A */ public class A {}")
61
.classes("package pro; /** Class B */ public class B {}")
62
.write(src);
63
execTask("--module-source-path", src.toString(),
64
"--module", "m1");
65
checkModulesSpecified("m1");
66
checkPackagesIncluded("pub");
67
checkTypesIncluded("pub.A");
68
}
69
70
@Test
71
public void testMultipleModulesOption1(Path base) throws Exception {
72
Path src = base.resolve("src");
73
74
ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
75
mb1.comment("The first module.")
76
.exports("m1pub")
77
.requires("m2")
78
.classes("package m1pub; /** Class A */ public class A {}")
79
.classes("package m1pro; /** Class B */ public class B {}")
80
.write(src);
81
82
ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");
83
mb2.comment("The second module.")
84
.exports("m2pub")
85
.classes("package m2pub; /** Class A */ public class A {}")
86
.classes("package m2pro; /** Class B */ public class B {}")
87
.write(src);
88
execTask("--module-source-path", src.toString(),
89
"--module", "m1,m2");
90
checkModulesSpecified("m1", "m2");
91
checkPackagesIncluded("m1pub", "m2pub");
92
checkTypesIncluded("m1pub.A", "m2pub.A");
93
94
}
95
96
@Test
97
public void testMissingModuleWithSourcePath(Path base) throws Exception {
98
Path src = base.resolve("src");
99
Path mod = src.resolve("m1");
100
101
ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
102
mb1.comment("The first module.")
103
.exports("m1pub")
104
.requires("m2")
105
.classes("package m1pub; /** Class A */ public class A {}")
106
.classes("package m1pro; /** Class B */ public class B {}")
107
.write(src);
108
109
Path javafile = Paths.get(mod.toString(), "m1pub/A.java");
110
111
execNegativeTask("--source-path", mod.toString(),
112
javafile.toString());
113
114
assertMessagePresent("error: cannot access module-info");
115
assertMessageNotPresent("error: fatal error encountered");
116
117
}
118
119
@Test
120
public void testMultipleModulesAggregatedModuleOption(Path base) throws Exception {
121
Path src = base.resolve("src");
122
123
ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
124
mb1.comment("The first module.")
125
.exports("m1pub")
126
.requires("m2")
127
.classes("package m1pub; /** Class A */ public class A {}")
128
.classes("package m1pro; /** Class B */ public class B {}")
129
.write(src);
130
131
ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");
132
mb2.comment("The second module.")
133
.exports("m2pub")
134
.classes("package m2pub; /** Class A */ public class A {}")
135
.classes("package m2pro; /** Class B */ public class B {}")
136
.write(src);
137
execTask("--module-source-path", src.toString(),
138
"--module", "m1",
139
"--module", "m2");
140
checkModulesSpecified("m1", "m2");
141
checkPackagesIncluded("m1pub", "m2pub");
142
checkTypesIncluded("m1pub.A", "m2pub.A");
143
144
}
145
146
@Test
147
public void testModulePathOption(Path base) throws Exception {
148
Path src = base.resolve("src");
149
Path modulePath = base.resolve("modules");
150
151
ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
152
mb1.comment("Module on module path.")
153
.exports("pkg1")
154
.classes("package pkg1; /** Class A */ public class A { }")
155
.build(modulePath);
156
157
ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");
158
mb2.comment("The second module.")
159
.exports("pkg2")
160
.requires("m1")
161
.classes("package pkg2; /** Class B */ public class B { /** Field f */ public pkg1.A f; }")
162
.write(src);
163
execTask("--module-source-path", src.toString(),
164
"--module-path", modulePath.toString(),
165
"--module", "m2");
166
checkModulesSpecified("m2");
167
checkPackagesIncluded("pkg2");
168
checkMembersSelected("pkg2.B.f");
169
170
// module path option "-p"
171
execTask("--module-source-path", src.toString(),
172
"-p", modulePath.toString(),
173
"--module", "m2");
174
// no module path
175
execNegativeTask("--module-source-path", src.toString(),
176
"--module", "m2");
177
assertMessagePresent("error: module not found: m1");
178
}
179
180
@Test
181
public void testUpgradeModulePathOption(Path base) throws Exception {
182
Path src = base.resolve("src");
183
Path modulePath = base.resolve("modules");
184
Path upgradePath = base.resolve("upgrades");
185
186
ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
187
mb1.comment("Module on module path.")
188
.exports("pkg1")
189
.classes("package pkg1; /** Class A */ public class A { }")
190
.build(modulePath);
191
192
ModuleBuilder mbUpgrade = new ModuleBuilder(tb, "m1");
193
mbUpgrade.comment("Module on upgrade module path.")
194
.exports("pkg1")
195
.classes("package pkg1; /** Class C */ public class C { }")
196
.build(upgradePath);
197
198
ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");
199
mb2.comment("The second module.")
200
.exports("pkg2")
201
.requires("m1")
202
.classes("package pkg2; /** Class B */ public class B { /** Field f */ public pkg1.C f; }")
203
.write(src);
204
execTask("--module-source-path", src.toString(),
205
"--module-path", modulePath.toString(),
206
"--upgrade-module-path", upgradePath.toString(),
207
"--module", "m2");
208
checkModulesSpecified("m2");
209
checkPackagesIncluded("pkg2");
210
checkMembersSelected("pkg2.B.f");
211
212
// no upgrade module path
213
execNegativeTask("--module-source-path", src.toString(),
214
"--module-path", modulePath.toString(),
215
"--module", "m2");
216
assertMessagePresent("error: cannot find symbol");
217
218
// dependency from module path
219
ModuleBuilder mb3 = new ModuleBuilder(tb, "m3");
220
mb3.comment("The third module.")
221
.exports("pkg3")
222
.requires("m1")
223
.classes("package pkg3; /** Class Z */ public class Z { /** Field f */ public pkg1.A f; }")
224
.write(src);
225
execNegativeTask("--module-source-path", src.toString(),
226
"--module-path", modulePath.toString(),
227
"--upgrade-module-path", upgradePath.toString(),
228
"--module", "m3");
229
assertMessagePresent("Z.java:1: error: cannot find symbol");
230
}
231
232
@Test
233
public void testAddModulesOption(Path base) throws Exception {
234
Path src = base.resolve("src");
235
Path modulePath = base.resolve("modules");
236
237
ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
238
mb1.comment("Module on module path.")
239
.exports("pkg1")
240
.classes("package pkg1; /** Class A */ public class A { }")
241
.build(modulePath);
242
243
ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");
244
mb2.comment("The second module.")
245
.exports("pkg2")
246
.classes("package pkg2; /** @see pkg1.A */ public class B { }")
247
.write(src);
248
249
Path out = base.resolve("out-1");
250
Files.createDirectories(out);
251
String log = new JavadocTask(tb)
252
.outdir(out)
253
.options("--module-source-path", src.toString(),
254
"--module-path", modulePath.toString(),
255
"--module", "m2")
256
.run(Expect.FAIL)
257
.writeAll()
258
.getOutput(OutputKind.DIRECT);
259
if (!log.contains("B.java:1: error: reference not found")) {
260
throw new Exception("Error not found");
261
}
262
263
out = base.resolve("out-2");
264
Files.createDirectories(out);
265
new JavadocTask(tb)
266
.outdir(out)
267
.options("--module-source-path", src.toString(),
268
"--module-path", modulePath.toString(),
269
"--add-modules", "m1",
270
"--module", "m2")
271
.run()
272
.writeAll();
273
}
274
275
@Test
276
public void testLimitModulesOption(Path base) throws Exception {
277
Path src = base.resolve("src");
278
Path modulePath = base.resolve("modules");
279
280
ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
281
mb1.comment("Module on module path.")
282
.build(modulePath);
283
284
ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");
285
mb2.comment("The second module.")
286
.exports("pkg2")
287
.requires("m1")
288
.classes("package pkg2; /** Class B */ public class B { }")
289
.write(src);
290
291
execNegativeTask("--module-source-path", src.toString(),
292
"--module-path", modulePath.toString(),
293
"--limit-modules", "java.base",
294
"--module", "m2");
295
assertMessagePresent("error: module not found: m1");
296
}
297
298
@Test
299
public void testAddExportsOption(Path base) throws Exception {
300
Path src = base.resolve("src");
301
Path modulePath = base.resolve("modules");
302
303
ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
304
mb1.comment("Module on module path.")
305
.classes("package pkg1; /** Class A */ public class A { }")
306
.build(modulePath);
307
308
ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");
309
mb2.comment("The second module.")
310
.exports("pkg2")
311
.requires("m1")
312
.classes("package pkg2; /** Class B */ public class B { /** Field f */ public pkg1.A f; }")
313
.write(src);
314
execTask("--module-source-path", src.toString(),
315
"--module-path", modulePath.toString(),
316
"--add-exports", "m1/pkg1=m2",
317
"--module", "m2");
318
checkModulesSpecified("m2");
319
checkPackagesIncluded("pkg2");
320
checkMembersSelected("pkg2.B.f");
321
}
322
323
@Test
324
public void testAddReadsOption(Path base) throws Exception {
325
Path src = base.resolve("src");
326
Path modulePath = base.resolve("modules");
327
328
ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
329
mb1.comment("Module on module path.")
330
.exports("pkg1")
331
.classes("package pkg1; /** Class A */ public class A {}")
332
.build(modulePath);
333
334
ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");
335
mb2.comment("The second module.")
336
.exports("pkg2")
337
.classes("package pkg2; /** Class B */ public class B { /** Field f */ public pkg1.A f;}")
338
.write(src);
339
execTask("--module-source-path", src.toString(),
340
"--module-path", modulePath.toString(),
341
"--add-modules", "m1",
342
"--add-reads", "m2=m1",
343
"--module", "m2");
344
checkModulesSpecified("m2");
345
checkPackagesIncluded("pkg2");
346
checkMembersSelected("pkg2.B.f");
347
}
348
349
@Test
350
public void testModuleOptionsWithLegacy(Path base) throws Exception {
351
Files.createDirectory(base);
352
Path src = base.resolve("src");
353
Path classpath = base.resolve("classpath");
354
Path modulePath = base.resolve("modules");
355
356
tb.writeJavaFiles(classpath, "package pkg1; /** Class C */ public class C { }");
357
new JavacTask(tb)
358
.files(classpath.resolve("pkg1/C.java"))
359
.run();
360
361
ModuleBuilder mb = new ModuleBuilder(tb, "m1");
362
mb.comment("The first module.")
363
.exports("pub")
364
.classes("package pub; /** Class M */ public class M { }")
365
.build(modulePath);
366
367
tb.writeJavaFiles(src, "package pkg; /** Class L */ public class L { public pkg1.C f1; public pub.M f2; }");
368
369
execTask("--source-path", src.toString(),
370
"--class-path", classpath.toString(),
371
"--module-path", modulePath.toString(),
372
"--add-modules", "m1",
373
"pkg");
374
checkPackagesIncluded("pkg");
375
checkTypesIncluded("pkg.L");
376
checkMembersSelected("pkg.L.f1");
377
checkMembersSelected("pkg.L.f2");
378
assertAbsent("error", OutputKind.DIRECT);
379
}
380
381
/**
382
* Tests diamond graph, inspired by javac diamond tests.
383
*
384
*
385
* Module M : test module, with variable requires
386
*
387
* Module N :
388
* requires transitive O ---> Module O:
389
* requires J ----> Module J:
390
* exports openO exports openJ
391
*
392
*
393
* Module L :
394
* requires transitive P ---> Module P:
395
* exports openP
396
*
397
*
398
*/
399
400
@Test
401
public void testExpandRequiresNone(Path base) throws Exception {
402
Path src = base.resolve("src");
403
404
createAuxiliaryModules(src);
405
406
new ModuleBuilder(tb, "M")
407
.comment("The M module.")
408
.requires("N", src)
409
.requires("L", src)
410
.requires("O", src)
411
.exports("p")
412
.classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
413
.write(src);
414
415
execTask("--module-source-path", src.toString(),
416
"--module", "M");
417
418
checkModulesSpecified("M");
419
checkModulesIncluded("M");
420
checkPackagesIncluded("p");
421
checkTypesIncluded("p.Main");
422
checkPackagesNotIncluded(".*open.*");
423
assertMessageNotPresent("warning");
424
}
425
426
@Test
427
public void testExpandRequiresTransitive(Path base) throws Exception {
428
Path src = base.resolve("src");
429
430
createAuxiliaryModules(src);
431
432
new ModuleBuilder(tb, "M")
433
.comment("The M module.")
434
.requiresTransitive("N", src)
435
.requires("L", src)
436
.exports("p")
437
.classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
438
.write(src);
439
440
execTask("--module-source-path", src.toString(),
441
"--module", "M",
442
"--expand-requires", "transitive");
443
444
checkModulesSpecified("M", "N", "O");
445
checkModulesNotSpecified("java.base");
446
checkModulesIncluded("M", "N", "O");
447
checkModulesNotIncluded("java.base");
448
checkPackagesIncluded("p", "openN", "openO");
449
checkTypesIncluded("p.Main", "openN.N", "openO.O");
450
assertMessageNotPresent("warning");
451
}
452
453
@Test
454
public void testExpandRequiresTransitiveWithMandated(Path base) throws Exception {
455
Path src = base.resolve("src");
456
457
createAuxiliaryModules(src);
458
459
Path patchSrc = Paths.get(src.toString(), "patch");
460
461
new ModuleBuilder(tb, "M")
462
.comment("The M module.")
463
.requiresTransitive("N", src)
464
.requires("L", src)
465
.exports("p")
466
.classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
467
.write(src);
468
469
// build the patching module
470
tb.writeJavaFiles(patchSrc, """
471
package pkg1;
472
/** Class A */ public class A extends java.util.ArrayList { }""");
473
tb.writeJavaFiles(patchSrc, """
474
package pkg1;
475
/** Class B */ public class B { }""");
476
477
execTask("--module-source-path", src.toString(),
478
"--patch-module", "java.base=" + patchSrc.toString(),
479
"--module", "M",
480
"--expand-requires", "transitive");
481
482
checkModulesSpecified("java.base", "M", "N", "O");
483
checkModulesIncluded("java.base", "M", "N", "O");
484
checkPackagesIncluded("p", "openN", "openO");
485
checkTypesIncluded("p.Main", "openN.N", "openO.O");
486
assertMessageNotPresent("warning");
487
}
488
489
@Test
490
public void testExpandRequiresAll(Path base) throws Exception {
491
Path src = base.resolve("src");
492
493
createAuxiliaryModules(src);
494
495
new ModuleBuilder(tb, "M")
496
.comment("The M module.")
497
.requiresTransitive("N", src)
498
.requires("L", src)
499
.requires("O", src)
500
.exports("p")
501
.classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
502
.write(src);
503
504
execTask("--module-source-path", src.toString(),
505
"--module", "M",
506
"--expand-requires", "all");
507
508
checkModulesSpecified("M", "N", "L", "O");
509
checkModulesIncluded("M", "N", "L", "O");
510
checkModulesNotIncluded("P", "J", "Q");
511
checkPackagesIncluded("p", "openN", "openL", "openO");
512
checkPackagesNotIncluded(".*openP.*", ".*openJ.*");
513
checkTypesIncluded("p.Main", "openN.N", "openL.L", "openO.O");
514
checkTypesNotIncluded(".*openP.*", ".*openJ.*");
515
assertMessageNotPresent("warning");
516
}
517
518
@Test
519
public void testMissingModule(Path base) throws Exception {
520
Path src = base.resolve("src");
521
522
createAuxiliaryModules(src);
523
524
new ModuleBuilder(tb, "M")
525
.comment("The M module.")
526
.requiresTransitive("N", src)
527
.requires("L", src)
528
.requires("O", src)
529
.exports("p")
530
.classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
531
.write(src);
532
533
execNegativeTask("--module-source-path", src.toString(),
534
"--module", "MIA",
535
"--expand-requires", "all");
536
537
assertMessagePresent("error: module MIA not found");
538
}
539
540
@Test
541
public void testMissingModuleMultiModuleCmdline(Path base) throws Exception {
542
Path src = base.resolve("src");
543
544
createAuxiliaryModules(src);
545
546
new ModuleBuilder(tb, "M")
547
.comment("The M module.")
548
.requiresTransitive("N", src)
549
.requires("L", src)
550
.requires("O", src)
551
.exports("p")
552
.classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
553
.write(src);
554
555
execNegativeTask("--module-source-path", src.toString(),
556
"--module", "M,N,L,MIA,O,P",
557
"--expand-requires", "all");
558
559
assertMessagePresent("error: module MIA not found");
560
}
561
562
@Test
563
public void testSingleModuleOptionWithSourcePath(Path base) throws Exception {
564
Path src = base.resolve("src");
565
Path mod = createSimpleModule(src, "m1");
566
execTask("--source-path", mod.toString(),
567
"--module", "m1");
568
checkModulesSpecified("m1");
569
checkPackagesIncluded("p");
570
checkTypesIncluded("p.C");
571
}
572
573
@Test
574
public void testSingleModuleOptionWithMissingModuleInSourcePath(Path base) throws Exception {
575
Path src = base.resolve("src");
576
Path mod = createSimpleModule(src, "m1");
577
execNegativeTask("--source-path", mod.toString(),
578
"--module", "m2");
579
assertMessagePresent("source path does not contain module m2");
580
}
581
582
@Test
583
public void testMultipleModuleOptionWithSourcePath(Path base) throws Exception {
584
Path src = base.resolve("src");
585
Path mod = createSimpleModule(src, "m1");
586
execNegativeTask("--source-path", mod.toString(),
587
"--module", "m1,m2,m3");
588
assertMessagePresent("cannot use source path for multiple modules m1, m2, m3");
589
}
590
591
@Test
592
public void testSingleModuleOptionWithNoModuleOnSourcePath(Path base) throws Exception {
593
Path src = base.resolve("src");
594
Path mod1 = Paths.get(src.toString(), "m1");
595
execNegativeTask("--source-path", mod1.toString(),
596
"--module", "m1");
597
assertMessagePresent("module m1 not found on source path");
598
}
599
600
Path createSimpleModule(Path src, String mname) throws IOException {
601
Path mpath = Paths.get(src.toString(), mname);
602
tb.writeJavaFiles(mpath,
603
"module " + mname + " { exports p; }",
604
"package p; public class C { }");
605
return mpath;
606
}
607
608
void createAuxiliaryModules(Path src) throws IOException {
609
610
new ModuleBuilder(tb, "J")
611
.comment("The J module.")
612
.exports("openJ")
613
.classes("package openJ; /** Class J open. */ public class J { }")
614
.classes("package closedJ; /** Class J closed. */ public class J { }")
615
.write(src);
616
617
new ModuleBuilder(tb, "L")
618
.comment("The L module.")
619
.exports("openL")
620
.requiresTransitive("P")
621
.classes("package openL; /** Class L open */ public class L { }")
622
.classes("package closedL; /** Class L closed */ public class L { }")
623
.write(src);
624
625
new ModuleBuilder(tb, "N")
626
.comment("The N module.")
627
.exports("openN")
628
.requiresTransitive("O")
629
.classes("package openN; /** Class N open */ public class N { }")
630
.classes("package closedN; /** Class N closed */ public class N { }")
631
.write(src);
632
633
new ModuleBuilder(tb, "O")
634
.comment("The O module.")
635
.exports("openO")
636
.requires("J")
637
.classes("package openO; /** Class O open. */ public class O { openJ.J j; }")
638
.classes("package closedO; /** Class O closed. */ public class O { }")
639
.write(src);
640
641
new ModuleBuilder(tb, "P")
642
.comment("The P module.")
643
.exports("openP")
644
.requires("J")
645
.classes("package openP; /** Class O open. */ public class O { openJ.J j; }")
646
.classes("package closedP; /** Class O closed. */ public class O { }")
647
.write(src);
648
649
new ModuleBuilder(tb, "Q")
650
.comment("The Q module.")
651
.exports("openQ")
652
.requires("J")
653
.classes("package openQ; /** Class Q open. */ public class Q { openJ.J j; }")
654
.classes("package closedQ; /** Class Q closed. */ public class Q { }")
655
.write(src);
656
657
}
658
659
@Test
660
public void testSingleModuleOptionWithSourcePathAndAnnotatedModule(Path base) throws Exception {
661
Path src = base.resolve("src");
662
Path mod = Paths.get(src.toString(), "m1");
663
tb.writeJavaFiles(mod,
664
"@Deprecated module m1 { exports p; }",
665
"package p; public class C { }",
666
"package p; public class P { }");
667
execTask("--source-path", mod.toString(),
668
"--module", "m1");
669
checkModulesSpecified("m1");
670
checkPackagesIncluded("p");
671
checkTypesIncluded("p.C");
672
checkTypesIncluded("p.P");
673
}
674
675
}
676
677