1 /* |
1 /* |
2 * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
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 |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. Oracle designates this |
7 * published by the Free Software Foundation. Oracle designates this |
23 * questions. |
23 * questions. |
24 */ |
24 */ |
25 |
25 |
26 package com.sun.tools.javac.comp; |
26 package com.sun.tools.javac.comp; |
27 |
27 |
28 import java.util.ArrayList; |
28 import java.util.ArrayDeque; |
|
29 import java.util.EnumSet; |
|
30 import java.util.HashMap; |
|
31 import java.util.Map; |
|
32 import java.util.Queue; |
|
33 import java.util.function.Predicate; |
29 |
34 |
30 import com.sun.source.tree.LambdaExpressionTree; |
35 import com.sun.source.tree.LambdaExpressionTree; |
|
36 import com.sun.source.tree.NewClassTree; |
|
37 import com.sun.tools.javac.code.Flags; |
|
38 import com.sun.tools.javac.code.Kinds.Kind; |
31 import com.sun.tools.javac.code.Source; |
39 import com.sun.tools.javac.code.Source; |
32 import com.sun.tools.javac.code.Source.Feature; |
40 import com.sun.tools.javac.code.Source.Feature; |
|
41 import com.sun.tools.javac.code.Symbol.ClassSymbol; |
33 import com.sun.tools.javac.code.Type; |
42 import com.sun.tools.javac.code.Type; |
34 import com.sun.tools.javac.code.Types; |
43 import com.sun.tools.javac.code.Types; |
35 import com.sun.tools.javac.comp.ArgumentAttr.LocalCacheContext; |
44 import com.sun.tools.javac.comp.ArgumentAttr.LocalCacheContext; |
36 import com.sun.tools.javac.resources.CompilerProperties.Warnings; |
45 import com.sun.tools.javac.resources.CompilerProperties.Warnings; |
37 import com.sun.tools.javac.tree.JCTree; |
46 import com.sun.tools.javac.tree.JCTree; |
46 import com.sun.tools.javac.tree.JCTree.JCMethodDecl; |
55 import com.sun.tools.javac.tree.JCTree.JCMethodDecl; |
47 import com.sun.tools.javac.tree.JCTree.JCMethodInvocation; |
56 import com.sun.tools.javac.tree.JCTree.JCMethodInvocation; |
48 import com.sun.tools.javac.tree.JCTree.JCNewClass; |
57 import com.sun.tools.javac.tree.JCTree.JCNewClass; |
49 import com.sun.tools.javac.tree.JCTree.JCStatement; |
58 import com.sun.tools.javac.tree.JCTree.JCStatement; |
50 import com.sun.tools.javac.tree.JCTree.JCSwitch; |
59 import com.sun.tools.javac.tree.JCTree.JCSwitch; |
|
60 import com.sun.tools.javac.tree.JCTree.JCTry; |
51 import com.sun.tools.javac.tree.JCTree.JCTypeApply; |
61 import com.sun.tools.javac.tree.JCTree.JCTypeApply; |
|
62 import com.sun.tools.javac.tree.JCTree.JCUnary; |
52 import com.sun.tools.javac.tree.JCTree.JCVariableDecl; |
63 import com.sun.tools.javac.tree.JCTree.JCVariableDecl; |
53 import com.sun.tools.javac.tree.JCTree.JCWhileLoop; |
64 import com.sun.tools.javac.tree.JCTree.JCWhileLoop; |
54 import com.sun.tools.javac.tree.JCTree.Tag; |
65 import com.sun.tools.javac.tree.JCTree.Tag; |
55 import com.sun.tools.javac.tree.TreeCopier; |
66 import com.sun.tools.javac.tree.TreeCopier; |
56 import com.sun.tools.javac.tree.TreeInfo; |
67 import com.sun.tools.javac.tree.TreeInfo; |
57 import com.sun.tools.javac.tree.TreeMaker; |
68 import com.sun.tools.javac.tree.TreeMaker; |
58 import com.sun.tools.javac.tree.TreeScanner; |
69 import com.sun.tools.javac.tree.TreeScanner; |
|
70 import com.sun.tools.javac.util.Assert; |
59 import com.sun.tools.javac.util.Context; |
71 import com.sun.tools.javac.util.Context; |
60 import com.sun.tools.javac.util.DefinedBy; |
72 import com.sun.tools.javac.util.DefinedBy; |
61 import com.sun.tools.javac.util.DefinedBy.Api; |
73 import com.sun.tools.javac.util.DefinedBy.Api; |
|
74 import com.sun.tools.javac.util.DiagnosticSource; |
62 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticType; |
75 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticType; |
63 import com.sun.tools.javac.util.List; |
76 import com.sun.tools.javac.util.List; |
64 import com.sun.tools.javac.util.ListBuffer; |
77 import com.sun.tools.javac.util.ListBuffer; |
65 import com.sun.tools.javac.util.Log; |
78 import com.sun.tools.javac.util.Log; |
66 import com.sun.tools.javac.util.Options; |
79 import com.sun.tools.javac.util.Options; |
67 import com.sun.tools.javac.util.Position; |
80 import com.sun.tools.javac.util.Position; |
68 |
|
69 import java.util.EnumSet; |
|
70 import java.util.HashMap; |
|
71 import java.util.Map; |
|
72 import java.util.function.Predicate; |
|
73 |
|
74 import com.sun.source.tree.NewClassTree; |
|
75 import com.sun.tools.javac.code.Flags; |
|
76 import com.sun.tools.javac.code.Kinds.Kind; |
|
77 import com.sun.tools.javac.code.Symbol.ClassSymbol; |
|
78 import com.sun.tools.javac.tree.JCTree.JCTry; |
|
79 import com.sun.tools.javac.tree.JCTree.JCUnary; |
|
80 import com.sun.tools.javac.util.Assert; |
|
81 import com.sun.tools.javac.util.DiagnosticSource; |
|
82 |
81 |
83 import static com.sun.tools.javac.code.Flags.GENERATEDCONSTR; |
82 import static com.sun.tools.javac.code.Flags.GENERATEDCONSTR; |
84 import static com.sun.tools.javac.code.TypeTag.CLASS; |
83 import static com.sun.tools.javac.code.TypeTag.CLASS; |
85 import static com.sun.tools.javac.tree.JCTree.Tag.APPLY; |
84 import static com.sun.tools.javac.tree.JCTree.Tag.APPLY; |
86 import static com.sun.tools.javac.tree.JCTree.Tag.FOREACHLOOP; |
85 import static com.sun.tools.javac.tree.JCTree.Tag.FOREACHLOOP; |
519 * Simple deferral handler. All tasks belonging to the same outermost class are added to |
518 * Simple deferral handler. All tasks belonging to the same outermost class are added to |
520 * the same queue. The queue is flushed after flow analysis (only if no error occurred). |
519 * the same queue. The queue is flushed after flow analysis (only if no error occurred). |
521 */ |
520 */ |
522 DeferredAnalysisHelper queueDeferredHelper = new DeferredAnalysisHelper() { |
521 DeferredAnalysisHelper queueDeferredHelper = new DeferredAnalysisHelper() { |
523 |
522 |
524 Map<ClassSymbol, ArrayList<RewritingContext>> Q = new HashMap<>(); |
523 Map<ClassSymbol, Queue<RewritingContext>> Q = new HashMap<>(); |
525 |
524 |
526 @Override |
525 @Override |
527 public void queue(RewritingContext rewriting) { |
526 public void queue(RewritingContext rewriting) { |
528 ArrayList<RewritingContext> s = Q.computeIfAbsent(rewriting.env.enclClass.sym.outermostClass(), k -> new ArrayList<>()); |
527 Queue<RewritingContext> s = Q.computeIfAbsent(rewriting.env.enclClass.sym.outermostClass(), k -> new ArrayDeque<>()); |
529 s.add(rewriting); |
528 s.add(rewriting); |
530 } |
529 } |
531 |
530 |
532 @Override |
531 @Override |
533 public void flush(Env<AttrContext> flushEnv) { |
532 public void flush(Env<AttrContext> flushEnv) { |
534 if (!Q.isEmpty()) { |
533 if (!Q.isEmpty()) { |
535 DeferredAnalysisHelper prevHelper = deferredAnalysisHelper; |
534 DeferredAnalysisHelper prevHelper = deferredAnalysisHelper; |
536 try { |
535 try { |
537 deferredAnalysisHelper = flushDeferredHelper; |
536 deferredAnalysisHelper = flushDeferredHelper; |
538 ArrayList<RewritingContext> rewritings = Q.get(flushEnv.enclClass.sym.outermostClass()); |
537 Queue<RewritingContext> rewritings = Q.get(flushEnv.enclClass.sym.outermostClass()); |
539 while (rewritings != null && !rewritings.isEmpty()) { |
538 while (rewritings != null && !rewritings.isEmpty()) { |
540 doAnalysis(rewritings.remove(0)); |
539 doAnalysis(rewritings.remove()); |
541 } |
540 } |
542 } finally { |
541 } finally { |
543 deferredAnalysisHelper = prevHelper; |
542 deferredAnalysisHelper = prevHelper; |
544 } |
543 } |
545 } |
544 } |