home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.javac;
-
- import java.io.BufferedInputStream;
- import java.io.DataInputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.io.PrintStream;
- import java.io.Reader;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Vector;
- import sun.tools.java.BinaryClass;
- import sun.tools.java.ClassDeclaration;
- import sun.tools.java.ClassDefinition;
- import sun.tools.java.ClassFile;
- import sun.tools.java.ClassNotFound;
- import sun.tools.java.ClassPath;
- import sun.tools.java.CompilerError;
- import sun.tools.java.Constants;
- import sun.tools.java.Environment;
- import sun.tools.java.FieldDefinition;
- import sun.tools.java.Identifier;
- import sun.tools.java.IdentifierToken;
- import sun.tools.java.Package;
- import sun.tools.java.Parser;
- import sun.tools.java.Type;
- import sun.tools.tree.Node;
-
- public class BatchEnvironment extends Environment implements ErrorConsumer {
- OutputStream out;
- ClassPath path;
- Hashtable packages;
- Vector classesOrdered;
- Hashtable classes;
- public int flags;
- public File covFile;
- public int nerrors;
- public int nwarnings;
- public int ndeprecations;
- Vector deprecationFiles;
- ErrorConsumer errorConsumer;
- String errorFileName;
- ErrorMessage errors;
- private int errorsPushed;
- public int errorLimit;
- private boolean hitErrorLimit;
-
- public BatchEnvironment(ClassPath var1) {
- this(System.out, var1);
- }
-
- public BatchEnvironment(OutputStream var1, ClassPath var2) {
- this(var1, var2, (ErrorConsumer)null);
- }
-
- public BatchEnvironment(OutputStream var1, ClassPath var2, ErrorConsumer var3) {
- this.packages = new Hashtable(31);
- this.classesOrdered = new Vector();
- this.classes = new Hashtable(351);
- this.deprecationFiles = new Vector();
- this.errorLimit = 100;
- this.out = var1;
- this.path = var2;
- if (var3 == null) {
- this.errorConsumer = this;
- } else {
- this.errorConsumer = var3;
- }
- }
-
- public int getFlags() {
- return this.flags;
- }
-
- public File getcovFile() {
- return this.covFile;
- }
-
- public Enumeration getClasses() {
- return this.classesOrdered.elements();
- }
-
- public ClassDeclaration getClassDeclaration(Identifier var1) {
- return this.getClassDeclaration(Type.tClass(var1));
- }
-
- public ClassDeclaration getClassDeclaration(Type var1) {
- ClassDeclaration var2 = (ClassDeclaration)this.classes.get(var1);
- if (var2 == null) {
- this.classes.put(var1, var2 = new ClassDeclaration(var1.getClassName()));
- this.classesOrdered.addElement(var2);
- }
-
- return var2;
- }
-
- public boolean classExists(Identifier var1) {
- if (var1.isInner()) {
- var1 = var1.getTopName();
- }
-
- Type var2 = Type.tClass(var1);
-
- try {
- ClassDeclaration var3 = (ClassDeclaration)this.classes.get(var2);
- return var3 != null ? var3.getName().equals(var1) : this.getPackage(var1.getQualifier()).classExists(var1.getName());
- } catch (IOException var4) {
- return true;
- }
- }
-
- public Identifier generateName(Identifier var1, Identifier var2) {
- Identifier var3 = var1.getFlatName();
- Identifier var4 = Identifier.lookup(var1.getQualifier(), var3.getHead());
- int var5 = 1;
-
- while(true) {
- String var6 = var5 + (var2.equals(Constants.idNull) ? "" : "$" + var2);
- Identifier var7 = Identifier.lookupInner(var4, Identifier.lookup(var6));
- if (this.classes.get(Type.tClass(var7)) == null) {
- return var7;
- }
-
- ++var5;
- }
- }
-
- public Package getPackage(Identifier var1) throws IOException {
- Package var2 = (Package)this.packages.get(var1);
- if (var2 == null) {
- this.packages.put(var1, var2 = new Package(this.path, var1));
- }
-
- return var2;
- }
-
- public void parseFile(ClassFile var1) throws FileNotFoundException {
- long var2 = System.currentTimeMillis();
-
- InputStream var4;
- BatchParser var5;
- try {
- var4 = var1.getInputStream();
- Environment var6 = new Environment(this, var1);
- var6.setCharacterEncoding(((Environment)this).getCharacterEncoding());
- var5 = new BatchParser(var6, new BufferedInputStream(var4));
- } catch (IOException var9) {
- throw new FileNotFoundException();
- }
-
- try {
- ((Parser)var5).parseFile();
- } catch (Exception var8) {
- throw new CompilerError(var8);
- }
-
- try {
- var4.close();
- } catch (IOException var7) {
- }
-
- if (((Environment)this).verbose()) {
- var2 = System.currentTimeMillis() - var2;
- this.output(Main.getText("benv.parsed_in", var1.getPath(), Long.toString(var2)));
- }
-
- }
-
- BinaryClass loadFile(ClassFile var1) throws IOException {
- long var2 = System.currentTimeMillis();
- InputStream var4 = var1.getInputStream();
- BinaryClass var5 = null;
-
- try {
- DataInputStream var6 = new DataInputStream(new BufferedInputStream(var4));
- var5 = BinaryClass.load(new Environment(this, var1), var6, this.loadFileFlags());
- } catch (ClassFormatError var7) {
- ((Environment)this).error(0, "class.format", var1.getPath(), ((Throwable)var7).getMessage());
- return null;
- } catch (Exception var8) {
- ((Throwable)var8).printStackTrace();
- }
-
- var4.close();
- if (((Environment)this).verbose()) {
- var2 = System.currentTimeMillis() - var2;
- this.output(Main.getText("benv.loaded_in", var1.getPath(), Long.toString(var2)));
- }
-
- return var5;
- }
-
- int loadFileFlags() {
- return 0;
- }
-
- boolean needsCompilation(Hashtable var1, ClassDeclaration var2) {
- switch (var2.getStatus()) {
- case 0:
- this.loadDefinition(var2);
- return this.needsCompilation(var1, var2);
- case 1:
- if (var1.get(var2) == null) {
- var1.put(var2, var2);
- BinaryClass var3 = (BinaryClass)var2.getClassDefinition();
- Enumeration var4 = var3.getDependencies();
-
- while(var4.hasMoreElements()) {
- ClassDeclaration var5 = (ClassDeclaration)var4.nextElement();
- if (this.needsCompilation(var1, var5)) {
- var2.setDefinition(var3, 3);
- return true;
- }
- }
- }
-
- return false;
- case 2:
- return false;
- default:
- return true;
- }
- }
-
- public void loadDefinition(ClassDeclaration var1) {
- switch (var1.getStatus()) {
- case 0:
- Identifier var14 = var1.getName();
-
- Package var16;
- try {
- var16 = this.getPackage(var14.getQualifier());
- } catch (IOException var12) {
- ((Environment)this).error(0, "io.exception", var1);
- return;
- }
-
- ClassFile var19 = var16.getBinaryFile(var14.getName());
- if (var19 == null) {
- var1.setDefinition((ClassDefinition)null, 3);
- return;
- } else {
- ClassFile var5 = var16.getSourceFile(var14.getName());
- if (var5 == null) {
- Object var22 = null;
-
- try {
- var23 = this.loadFile(var19);
- } catch (IOException var10) {
- ((Environment)this).error(0, "io.exception", var19);
- return;
- }
-
- if (var23 != null && !((ClassDefinition)var23).getName().equals(var14)) {
- ((Environment)this).error(0, "wrong.class", var19.getPath(), var1, var23);
- var23 = null;
- }
-
- if (var23 == null) {
- var1.setDefinition((ClassDefinition)null, 6);
- return;
- } else {
- if (((ClassDefinition)var23).getSource() != null) {
- var5 = new ClassFile(new File((String)((ClassDefinition)var23).getSource()));
- var5 = var16.getSourceFile(var5.getName());
- if (var5 != null && var5.exists()) {
- if (var5.lastModified() > var19.lastModified()) {
- var1.setDefinition(var23, 3);
- var23.hasBeenLoaded(this);
- return;
- }
-
- var1.setDefinition(var23, ((Environment)this).dependencies() ? 1 : 2);
- var23.hasBeenLoaded(this);
- return;
- }
- }
-
- var1.setDefinition(var23, 2);
- var23.hasBeenLoaded(this);
- return;
- }
- } else {
- BinaryClass var6 = null;
-
- try {
- if (var5.lastModified() > var19.lastModified()) {
- var1.setDefinition((ClassDefinition)null, 3);
- return;
- }
-
- var6 = this.loadFile(var19);
- } catch (IOException var11) {
- ((Environment)this).error(0, "io.exception", var19);
- }
-
- if (var6 != null && !((ClassDefinition)var6).getName().equals(var14)) {
- ((Environment)this).error(0, "wrong.class", var19.getPath(), var1, var6);
- var6 = null;
- }
-
- if (var6 != null) {
- if (((ClassDefinition)var6).getName().equals(var1.getName())) {
- var1.setDefinition(var6, ((Environment)this).dependencies() ? 1 : 2);
- } else {
- var1.setDefinition((ClassDefinition)null, 6);
- this.getClassDeclaration(((ClassDefinition)var6).getName()).setDefinition(var6, ((Environment)this).dependencies() ? 1 : 2);
- }
- } else {
- var1.setDefinition((ClassDefinition)null, 6);
- }
-
- if (var6 != null && var6 == var1.getClassDefinition()) {
- var6.hasBeenLoaded(this);
- }
-
- return;
- }
- }
- case 1:
- Hashtable var13 = new Hashtable();
- if (!this.needsCompilation(var13, var1)) {
- Enumeration var15 = var13.keys();
-
- while(var15.hasMoreElements()) {
- ClassDeclaration var18 = (ClassDeclaration)var15.nextElement();
- if (var18.getStatus() == 1) {
- var18.setDefinition(var18.getClassDefinition(), 2);
- }
- }
- }
-
- return;
- case 2:
- default:
- return;
- case 3:
- ClassFile var2 = null;
- Package var3 = null;
- if (var1.getClassDefinition() != null) {
- try {
- var3 = this.getPackage(var1.getName().getQualifier());
- var2 = var3.getSourceFile((String)var1.getClassDefinition().getSource());
- } catch (IOException var9) {
- ((Environment)this).error(0, "io.exception", var1);
- }
-
- if (var2 == null) {
- String var4 = (String)var1.getClassDefinition().getSource();
- var2 = new ClassFile(new File(var4));
- }
- } else {
- Identifier var17 = var1.getName();
-
- try {
- var3 = this.getPackage(var17.getQualifier());
- var2 = var3.getSourceFile(var17.getName());
- } catch (IOException var8) {
- ((Environment)this).error(0, "io.exception", var1);
- }
-
- if (var2 == null) {
- var1.setDefinition((ClassDefinition)null, 6);
- return;
- }
- }
-
- try {
- this.parseFile(var2);
- } catch (FileNotFoundException var7) {
- ((Environment)this).error(0, "io.exception", var2);
- }
-
- if (var1.getClassDefinition() == null || var1.getStatus() == 3) {
- ((Environment)this).error(0, "wrong.source", var2.getPath(), var1, var3);
- var1.setDefinition((ClassDefinition)null, 6);
- }
-
- }
- }
-
- public ClassDefinition makeClassDefinition(Environment var1, int var2, IdentifierToken var3, String var4, int var5, IdentifierToken var6, IdentifierToken[] var7, ClassDefinition var8) {
- Identifier var9 = var3.getName();
- int var10 = var3.getWhere();
- Identifier var11;
- if (!var9.isQualified() && !var9.isInner()) {
- if ((var5 & 196608) != 0) {
- var11 = this.generateName(var8.getName(), var9);
- } else if (var8 != null) {
- var11 = Identifier.lookupInner(var8.getName(), var9);
- } else {
- var11 = var9;
- }
- } else {
- var11 = var9;
- }
-
- ClassDeclaration var12 = var1.getClassDeclaration(var11);
- if (var12.isDefined()) {
- var1.error(var10, "class.multidef", var12.getName(), var12.getClassDefinition().getSource());
- var12 = new ClassDeclaration(var11);
- }
-
- if (var6 == null && !var11.equals(Constants.idJavaLangObject)) {
- var6 = new IdentifierToken(Constants.idJavaLangObject);
- }
-
- SourceClass var13 = new SourceClass(var1, var2, var12, var4, var5, var6, var7, (SourceClass)var8);
- if (var8 != null) {
- var8.addField(var1, new SourceField(var13));
- }
-
- if (((ClassDefinition)var13).isAnonymous()) {
- ((ClassDefinition)var13).setLocalName(Constants.idNull);
- } else if (((ClassDefinition)var13).isLocal()) {
- ((ClassDefinition)var13).setLocalName(var9);
- }
-
- return var13;
- }
-
- public FieldDefinition makeFieldDefinition(Environment var1, int var2, ClassDefinition var3, String var4, int var5, Type var6, Identifier var7, IdentifierToken[] var8, IdentifierToken[] var9, Object var10) {
- Vector var11 = null;
- if (var8 != null) {
- var11 = new Vector(var8.length);
-
- for(int var12 = 0; var12 < var8.length; ++var12) {
- var11.addElement(var8[var12]);
- }
- }
-
- SourceField var13 = new SourceField(var2, var3, var4, var5, var6, var7, var11, var9, (Node)var10);
- var3.addField(var1, var13);
- return var13;
- }
-
- public void shutdown() {
- if (this.path != null) {
- try {
- this.path.close();
- } catch (IOException var2) {
- this.output(Main.getText("benv.failed_to_close_class_path", ((Throwable)var2).toString()));
- }
-
- this.path = null;
- }
-
- super.shutdown();
- }
-
- public String errorString(String var1, Object var2, Object var3, Object var4) {
- Object var5 = null;
- String var6;
- if (var1.startsWith("warn.")) {
- var6 = "javac.err." + var1.substring(5);
- } else {
- var6 = "javac.err." + var1;
- }
-
- return Main.getText(var6, var2 != null ? var2.toString() : null, var3 != null ? var3.toString() : null, var4 != null ? var4.toString() : null);
- }
-
- public void insertError(int var1, String var2) {
- ErrorMessage var3 = new ErrorMessage(var1, var2);
- if (this.errors == null) {
- this.errors = var3;
- } else if (this.errors.where > var1) {
- var3.next = this.errors;
- this.errors = var3;
- } else {
- ErrorMessage var4;
- for(var4 = this.errors; var4.next != null && var4.next.where <= var1; var4 = var4.next) {
- }
-
- var3.next = var4.next;
- var4.next = var3;
- }
- }
-
- public void pushError(String var1, int var2, String var3, String var4, String var5) {
- int var6 = this.errorLimit + this.nwarnings;
- if (++this.errorsPushed >= var6 && this.errorLimit >= 0) {
- if (!this.hitErrorLimit) {
- this.hitErrorLimit = true;
- this.output(this.errorString("too.many.errors", new Integer(this.errorLimit), (Object)null, (Object)null));
- }
-
- } else {
- this.output(var1 + ":" + var2 + ":" + " " + var3);
- this.output(var4);
- this.output(var5);
- }
- }
-
- public void flushErrors() {
- if (this.errors != null) {
- try {
- FileInputStream var1 = new FileInputStream(this.errorFileName);
- char[] var2 = new char[var1.available()];
- InputStreamReader var3 = ((Environment)this).getCharacterEncoding() != null ? new InputStreamReader(var1, ((Environment)this).getCharacterEncoding()) : new InputStreamReader(var1);
- int var4 = ((Reader)var3).read(var2);
- var3.close();
-
- for(ErrorMessage var5 = this.errors; var5 != null; var5 = var5.next) {
- ErrorMessage var6;
- while((var6 = var5.next) != null && var5.where == var6.where && var5.message.equals(var6.message)) {
- var5 = var6;
- if (this.nwarnings > 1) {
- --this.nwarnings;
- } else {
- --this.nerrors;
- }
- }
-
- int var7 = var5.where >>> 18;
- int var8 = var5.where & 262143;
- if (var8 > var4) {
- var8 = var4;
- }
-
- int var9;
- for(var9 = var8; var9 > 0 && var2[var9 - 1] != '\n' && var2[var9 - 1] != '\r'; --var9) {
- }
-
- int var10;
- for(var10 = var8; var10 < var4 && var2[var10] != '\n' && var2[var10] != '\r'; ++var10) {
- }
-
- String var11 = new String(var2, var9, var10 - var9);
- char[] var12 = new char[var8 - var9 + 1];
-
- for(int var15 = var9; var15 < var8; ++var15) {
- var12[var15 - var9] = (char)(var2[var15] == '\t' ? 9 : 32);
- }
-
- var12[var8 - var9] = '^';
- String var13 = new String(var12);
- this.errorConsumer.pushError(this.errorFileName, var7, var5.message, var11, var13);
- }
- } catch (IOException var14) {
- this.output("I/O exception");
- }
-
- this.errors = null;
- }
- }
-
- public void reportError(Object var1, int var2, String var3, String var4) {
- if (var1 == null) {
- if (this.errorFileName != null) {
- this.flushErrors();
- this.errorFileName = null;
- }
-
- if (var3.startsWith("warn.")) {
- if (((Environment)this).warnings()) {
- ++this.nwarnings;
- this.output(var4);
- }
-
- } else {
- this.output("error: " + var4);
- ++this.nerrors;
- this.flags |= 65536;
- }
- } else if (var1 instanceof String) {
- String var7 = (String)var1;
- if (!var7.equals(this.errorFileName)) {
- this.flushErrors();
- this.errorFileName = var7;
- }
-
- if (var3.startsWith("warn.")) {
- if (var3.indexOf("is.deprecated") >= 0) {
- ++this.ndeprecations;
- if (!this.deprecationFiles.contains(var1)) {
- this.deprecationFiles.addElement(var1);
- }
-
- if (!((Environment)this).deprecation()) {
- return;
- }
- }
-
- ++this.nwarnings;
- if (!((Environment)this).warnings()) {
- return;
- }
- } else {
- ++this.nerrors;
- this.flags |= 65536;
- }
-
- this.insertError(var2, var4);
- } else if (var1 instanceof ClassFile) {
- this.reportError(((ClassFile)var1).getPath(), var2, var3, var4);
- } else if (var1 instanceof Identifier) {
- this.reportError(var1.toString(), var2, var3, var4);
- } else if (var1 instanceof ClassDeclaration) {
- try {
- this.reportError(((ClassDeclaration)var1).getClassDefinition(this), var2, var3, var4);
- } catch (ClassNotFound var6) {
- this.reportError(((ClassDeclaration)var1).getName(), var2, var3, var4);
- }
- } else if (var1 instanceof ClassDefinition) {
- ClassDefinition var5 = (ClassDefinition)var1;
- if (!var3.startsWith("warn.")) {
- var5.setError(true);
- }
-
- this.reportError(var5.getSource(), var2, var3, var4);
- } else if (var1 instanceof FieldDefinition) {
- this.reportError(((FieldDefinition)var1).getClassDeclaration(), var2, var3, var4);
- } else {
- this.output(var1 + ":error=" + var3 + ":" + var4);
- }
- }
-
- public void error(Object var1, int var2, String var3, Object var4, Object var5, Object var6) {
- if (this.errorsPushed < this.errorLimit + this.nwarnings) {
- if (System.getProperty("javac.dump.stack") != null) {
- this.output("javac.err." + var3 + ": " + this.errorString(var3, var4, var5, var6));
- (new Exception("Stack trace")).printStackTrace(new PrintStream(this.out));
- }
-
- this.reportError(var1, var2, var3, this.errorString(var3, var4, var5, var6));
- }
- }
-
- public void output(String var1) {
- PrintStream var2 = this.out instanceof PrintStream ? (PrintStream)this.out : new PrintStream(this.out, true);
- var2.println(var1);
- }
- }
-