30
30
import com .sun .source .util .Trees ;
31
31
import com .sun .tools .javac .api .JavacTaskImpl ;
32
32
import com .sun .tools .javac .util .Context ;
33
+ import java .net .URI ;
33
34
import java .util .ArrayList ;
34
35
import java .util .List ;
35
36
import javax .tools .Diagnostic ;
@@ -189,7 +190,7 @@ public <Z> Z compile(Collection<OuterWrap> wraps,
189
190
worker );
190
191
}
191
192
192
- private <S , T extends BaseTask , Z > Z runTask (Stream <S > inputs ,
193
+ private <S , T extends BaseTask < S > , Z > Z runTask (Stream <S > inputs ,
193
194
SourceHandler <S > sh ,
194
195
List <String > options ,
195
196
BiFunction <JavacTaskImpl , DiagnosticCollector <JavaFileObject >, T > creator ,
@@ -230,7 +231,7 @@ private <S, T extends BaseTask, Z> Z runTask(Stream<S> inputs,
230
231
});
231
232
}
232
233
233
- interface Worker <T extends BaseTask , Z > {
234
+ interface Worker <T extends BaseTask <?> , Z > {
234
235
public Z withTask (T task );
235
236
}
236
237
@@ -258,15 +259,26 @@ <Z> Z parse(final String source, Worker<ParseTask, Z> worker) {
258
259
private interface SourceHandler <T > {
259
260
260
261
JavaFileObject sourceToFileObject (MemoryFileManager fm , T t );
262
+ T sourceForFileObject (JavaFileObject file );
261
263
262
264
Diag diag (Diagnostic <? extends JavaFileObject > d );
263
265
}
264
266
265
267
private class StringSourceHandler implements SourceHandler <String > {
266
268
269
+ private final Map <URI , String > file2Snippet = new HashMap <>();
270
+
267
271
@ Override
268
272
public JavaFileObject sourceToFileObject (MemoryFileManager fm , String src ) {
269
- return fm .createSourceFileObject (src , "$NeverUsedName$" , src );
273
+ JavaFileObject result = fm .createSourceFileObject (src , "$NeverUsedName$" , src );
274
+
275
+ file2Snippet .put (result .toUri (), src );
276
+ return result ;
277
+ }
278
+
279
+ @ Override
280
+ public String sourceForFileObject (JavaFileObject file ) {
281
+ return file2Snippet .get (file .toUri ());
270
282
}
271
283
272
284
@ Override
@@ -308,9 +320,19 @@ public String getMessage(Locale locale) {
308
320
309
321
private class WrapSourceHandler implements SourceHandler <OuterWrap > {
310
322
323
+ private final Map <URI , OuterWrap > file2Snippet = new HashMap <>();
324
+
311
325
@ Override
312
326
public JavaFileObject sourceToFileObject (MemoryFileManager fm , OuterWrap w ) {
313
- return fm .createSourceFileObject (w , w .classFullName (), w .wrapped ());
327
+ JavaFileObject result = fm .createSourceFileObject (w , w .classFullName (), w .wrapped ());
328
+
329
+ file2Snippet .put (result .toUri (), w );
330
+ return result ;
331
+ }
332
+
333
+ @ Override
334
+ public OuterWrap sourceForFileObject (JavaFileObject file ) {
335
+ return file2Snippet .get (file .toUri ());
314
336
}
315
337
316
338
/**
@@ -332,7 +354,7 @@ public Diag diag(Diagnostic<? extends JavaFileObject> d) {
332
354
* Parse a snippet of code (as a String) using the parser subclass. Return
333
355
* the parse tree (and errors).
334
356
*/
335
- class ParseTask extends BaseTask {
357
+ class ParseTask extends BaseTask < String > {
336
358
337
359
private final Iterable <? extends CompilationUnitTree > cuts ;
338
360
private final List <? extends Tree > units ;
@@ -373,7 +395,7 @@ Iterable<? extends CompilationUnitTree> cuTrees() {
373
395
/**
374
396
* Run the normal "analyze()" pass of the compiler over the wrapped snippet.
375
397
*/
376
- class AnalyzeTask extends BaseTask {
398
+ class AnalyzeTask extends BaseTask < OuterWrap > {
377
399
378
400
private final Iterable <? extends CompilationUnitTree > cuts ;
379
401
@@ -411,7 +433,7 @@ javax.lang.model.util.Types getTypes() {
411
433
/**
412
434
* Unit the wrapped snippet to class files.
413
435
*/
414
- class CompileTask extends BaseTask {
436
+ class CompileTask extends BaseTask < OuterWrap > {
415
437
416
438
private final Map <OuterWrap , List <OutputMemoryJavaFileObject >> classObjs = new HashMap <>();
417
439
@@ -469,18 +491,18 @@ private void initTaskPool() {
469
491
javacTaskPool = new JavacTaskPool (5 );
470
492
}
471
493
472
- abstract class BaseTask {
494
+ abstract class BaseTask < S > {
473
495
474
496
final DiagnosticCollector <JavaFileObject > diagnostics ;
475
497
final JavacTaskImpl task ;
476
498
private DiagList diags = null ;
477
- private final SourceHandler <? > sourceHandler ;
499
+ private final SourceHandler <S > sourceHandler ;
478
500
final Context context ;
479
501
private Types types ;
480
502
private JavacMessages messages ;
481
503
private Trees trees ;
482
504
483
- private < T > BaseTask (SourceHandler <T > sh ,
505
+ private BaseTask (SourceHandler <S > sh ,
484
506
JavacTaskImpl task ,
485
507
DiagnosticCollector <JavaFileObject > diagnostics ) {
486
508
this .sourceHandler = sh ;
@@ -591,6 +613,10 @@ void debugPrintDiagnostics(String src) {
591
613
diag .getStartPosition (), diag .getEndPosition (), diag .getMessage (null ));
592
614
}
593
615
}
616
+
617
+ S sourceForFile (JavaFileObject sourceFile ) {
618
+ return sourceHandler .sourceForFileObject (sourceFile );
619
+ }
594
620
}
595
621
596
622
/**The variable types inferred for "var"s may be non-denotable.
0 commit comments