src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Analyzer.java
changeset 51045 215d1a5b097a
parent 49436 0fdb76741c56
child 51103 cecc2e10edf4
equal deleted inserted replaced
51044:68646e6522ca 51045:215d1a5b097a
     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             }