langtools/src/share/opensource/javac/doc/javac_lifecycle/ToDo.html
changeset 451 59439733e87a
parent 450 be95c1c0efcf
parent 408 cc1aa0299d0d
child 452 deabc19e963e
child 634 34d4a2d5b8cb
equal deleted inserted replaced
450:be95c1c0efcf 451:59439733e87a
     1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
       
     2 <!--
       
     3 Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
       
     4 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     5 
       
     6 This code is free software; you can redistribute it and/or modify it
       
     7 under the terms of the GNU General Public License version 2 only, as
       
     8 published by the Free Software Foundation.  Sun designates this
       
     9 particular file as subject to the "Classpath" exception as provided
       
    10 by Sun in the LICENSE file that accompanied this code.
       
    11 
       
    12 This code is distributed in the hope that it will be useful, but WITHOUT
       
    13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    15 version 2 for more details (a copy is included in the LICENSE file that
       
    16 accompanied this code).
       
    17 
       
    18 You should have received a copy of the GNU General Public License version
       
    19 2 along with this work; if not, write to the Free Software Foundation,
       
    20 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    21 
       
    22 Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
       
    23 CA 95054 USA or visit www.sun.com if you need additional information or
       
    24 have any questions.
       
    25 -->
       
    26 
       
    27 <html>
       
    28     <head>
       
    29         <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
       
    30         <meta name="author" content="Jonathan Gibbons">
       
    31         <link type="text/css" rel=stylesheet href="style.css">
       
    32         <title>JavaCompiler's "to do" list</title>
       
    33     </head>
       
    34     <body>
       
    35 
       
    36         <h3>com.sun.tools.javac.main.JavaCompiler's "to do" list</h3>
       
    37 
       
    38         <p>
       
    39             After the source files have been parsed, and their symbols entered 
       
    40             in the symbol table, the top level classes and some other items end 
       
    41             up on JavaCompiler's "to do" list.
       
    42         </p>
       
    43 
       
    44         <p>
       
    45             For each entry on the "to do" list, <code>JavaCompiler</code>
       
    46             processes it as follows:
       
    47         </p>
       
    48 
       
    49         <ul>
       
    50             <li><p>Some parts of the compilation involve modifying the parse tree,
       
    51                 so a copy of the root of the tree is kept prior to such manipulation.
       
    52             </p>
       
    53             <p class="note">
       
    54                 Note: this copy is just used to check whether the class is one of those
       
    55                 found in a compilation unit on the command line (i.e. in rootClasses).
       
    56             </p>
       
    57 
       
    58             <li><p>The top level classes are "attributed", using
       
    59                 <a href="../../src/share/classes/com/sun/tools/javac/comp/Attr.java" class="code">Attr</a>,
       
    60                 meaning that names and other elements within the parse tree are resolved
       
    61                 and associated with the corresponding types and symbols. Many semantic
       
    62                 errors may be detected here, either by <code>Attr</code>, or by
       
    63                 <a href="../../src/share/classes/com/sun/tools/javac/comp/Check.java" class="code">Check</a>.
       
    64             </p>
       
    65                 <p>While attributing the tree, class files will be read as necessary.
       
    66                     In addition, if a class is required, and a source file for the class is found
       
    67                     that is newer than the class file, the source file will be automatically parsed
       
    68                     and put on the "to do" list. This is done by registering JavaCompiler as an
       
    69                     implementation of 
       
    70                     <a href="../../src/share/classes/com/sun/tools/javac/comp/Attr.java" class="code">Attr</a><span class=code>.SourceCompleter</span>.
       
    71                 </p>
       
    72                 <p class=note>
       
    73                     Note: there is a hidden option <code>-attrparseonly</code> which can be used to skip
       
    74                     the rest of the processing for this file. In so doing, it "breaks" the
       
    75                     protocol use to save and restore the source file used to report error
       
    76                     messages (Log.useSource). There is a "try finally" block which
       
    77                     could reasonably be used/extended to restore the source file correctly.
       
    78                 </p>
       
    79             </li>
       
    80 
       
    81             <li><p>If there are no errors so far, flow analysis will be done for the class, using
       
    82                 <a href="../../src/share/classes/com/sun/tools/javac/comp/Flow.java" class="code">Flow</a>.
       
    83                 Flow analysis is used to check for definite assignment to variables,
       
    84                 and unreachable statements, which may result in additional errors.
       
    85             </p>
       
    86                 <p class="note">Note: flow analysis can be suppressed with the hidden
       
    87                     option <code>-relax</code>.
       
    88                 </p>
       
    89             </li>
       
    90 
       
    91             <li>If the "to do" item is a TopLevel tree, it will be the contents of a
       
    92             <span class="code">package-info.java</span> file, containing annotations for a package.
       
    93             (See notes for <a href="Enter.html#package-info">Enter</a>.) 
       
    94             <ul>
       
    95                 <li>Syntactic sugar is processed, using
       
    96                 <a href="../../src/share/classes/com/sun/tools/javac/comp/Lower.java" class="code">Lower</a>.
       
    97                 <code>Lower</code> is defined to return a list of trees for the translated classes
       
    98                 and all the translated inner classes.</li>
       
    99                 <li>If <code>Lower</code> returns a non-empty list, there is an assertion that
       
   100                     the list has a single element, in which case, code is generated, using 
       
   101                     <a href="../../src/share/classes/com/sun/tools/javac/jvm/Gen.java" class="code">Gen</a>,
       
   102                     and the resulting code is written out using 
       
   103                     <a href="../../src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java" class="code">ClassWriter</a>.
       
   104                 </li>
       
   105                 <li>No further processing is done on this "to do" item.<br>
       
   106                 </li>
       
   107             </ul>
       
   108             <p class=note>Note that <a href="Enter.html">Enter</a> will have processed all other TopLevel 
       
   109                 putting the individual classes that it finds there on the "to do" 
       
   110                 (and not the TopLevel node itself.)
       
   111             </p>
       
   112 
       
   113             <li>If stub outputs have been requested, with the hidden <code>-stubs</code> option,
       
   114             <ul>
       
   115                 <li>If the class was one of those mentioned on the command line and is in 
       
   116                 <span class=code>java.lang</span>,
       
   117                 pretty print the source with no method bodies.</li>
       
   118                 <li>No further processing is done on this "to do" item. </li>
       
   119             </ul>
       
   120 
       
   121             <li>Code involving generic types is translated to code without generic types, using 
       
   122                 <a href="../../src/share/classes/com/sun/tools/javac/comp/TransTypes.java" class="code">TransTypes</a>.
       
   123             </li>
       
   124 
       
   125             <li>If source output has been requested, with the hidden <code>-s</code> option
       
   126             <ul>
       
   127                 <li>If the original tree was from command line, pretty print the source code
       
   128                 </li>
       
   129                 <li>No further processing is done on this "to do" item.</li>
       
   130             </ul>
       
   131 
       
   132             <li>Syntactic sugar is processed, using 
       
   133             <a href="../../src/share/classes/com/sun/tools/javac/comp/Lower.java" class="code">Lower</a>.
       
   134             This takes care of inner classes, class literals, assertions, foreach
       
   135             loops, etc.
       
   136             <code>Lower</code> is defined to return a list of trees for the translated classes
       
   137             and all the translated inner classes.</li>
       
   138 
       
   139             <p class=note>
       
   140             Note: see also the use of <code>Lower</code> earlier in the loop, when processing
       
   141             TopLevel trees.</p>
       
   142 
       
   143             <li>For each class returned by <code>Lower</code><br>
       
   144             <ul>
       
   145                 <li>If source has been requestion with the hidden <code>-printflat</code>
       
   146                 option, the source of the class is printed.
       
   147                 <li>Otherwise, code for the class is generated, using 
       
   148                 <a href="../../src/share/classes/com/sun/tools/javac/jvm/Gen.java" class="code">Gen</a>,
       
   149                 and the resulting code is written out using 
       
   150                 <a href="../../src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java" class="code">ClassWriter</a>.
       
   151             </ul>
       
   152 
       
   153         </ul>
       
   154 
       
   155         <h4>Issues</h4>
       
   156         The "to do" list is mostly organized by top level classes, and not by 
       
   157         compilation units. This means that if a compilation unit contains several 
       
   158         classes, it is possible for code to be generated for some of the classes 
       
   159         in the file, at which point at error may be detected for one of the 
       
   160         remaining classes, preventing code from being generated for that and any 
       
   161         subsequent classes. This means that the compilation unit will be partially 
       
   162         compiled, with some but not all of the class files being generated. 
       
   163         (Bug <a href="http://monaco.sfbay.sun.com/detail.jsf?cr=5011101">5011101</a>)
       
   164 
       
   165     </body>
       
   166 </html>
       
   167