experiments/java/src/stx/libjava/tools/compiler/ecj/CompilerEnvironment.java
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 02 Apr 2013 23:08:51 +0100
branchdevelopment
changeset 2477 6e37b62e21b5
parent 2472 226437481a47
child 2488 5395660e3366
permissions -rw-r--r--
Bufix in CompilerEnvironment. Build correct java name from passed array. Fixes compilation of 'import static x.y.Z.*;'
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2472
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
package stx.libjava.tools.compiler.ecj;
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
2477
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
     3
import java.io.ByteArrayInputStream;
2472
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
import java.io.IOException;
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
import java.io.InputStream;
2477
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
     6
import java.util.HashMap;
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
     7
import java.util.Map;
2472
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader;
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException;
2477
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    11
import org.eclipse.jdt.internal.compiler.env.IBinaryType;
2472
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    13
import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer;
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
public class CompilerEnvironment implements INameEnvironment {
2477
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    16
	protected CompilerTypeRegistry types;
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    17
	
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    18
	public CompilerEnvironment() {
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    19
		 types = new CompilerTypeRegistry();
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    20
	}
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    21
	
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    22
	public CompilerEnvironment(CompilerTypeRegistry types) {
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    23
		this.types = types;
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    24
	}
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    25
	
2472
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
	/**
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
	 * Find a type with the given compound name.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
	 * Answer the binary form of the type if it is known to be consistent.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    29
	 * Otherwise, answer the compilation unit which defines the type
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
	 * or null if the type does not exist.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
	 * Types in the default package are specified as {{typeName}}.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
	 *
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
	 * It is unknown whether the package containing the type actually exists.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
	 *
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
	 * NOTE: This method can be used to find a member type using its
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
	 * internal name A$B, but the source file for A is answered if the binary
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    37
	 * file is inconsistent.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    38
	 */
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    39
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
	public NameEnvironmentAnswer findType(char[][] compoundTypeName) {
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
		StringBuilder sb = new StringBuilder();
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
		if (compoundTypeName.length > 1) {
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    43
			for (int i = 0; i < compoundTypeName.length - 1; i++) {
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
				sb.append(compoundTypeName[i]);
2477
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    45
				sb.append('.');
2472
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
			}		
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
		}
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
		sb.append(compoundTypeName[compoundTypeName.length-1]);
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
		return findType(sb.toString());
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
	}
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
	
2477
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    52
	/** 
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    53
	 * Returns a IBinaryType for class with given name or null
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    54
	 * if there's no such class. 
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    55
	 * @param name
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    56
	 * @return binary type or null (if no type is found)
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    57
	 */
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    58
	protected IBinaryType findTypeForClassNamed(String name) {
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    59
		IBinaryType type;
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    60
		
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    61
		type = types.get(name);
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    62
		if (type != null) return type;
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    63
		
2472
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
		try {
2477
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    65
			Class<?> c = Class.forName(name);
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    66
			InputStream cfs = findClassFileForClass(c);
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    67
			if (cfs == null) {
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    68
				return null;
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    69
			} else {
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    70
				types.put(name, cfs);
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    71
				return types.get(name);
2472
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
			}
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
		} catch (ClassNotFoundException cnfe) {
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
			return null;
2477
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    75
		} catch (RuntimeException e) {
2472
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
			e.printStackTrace();
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    77
			return null;
2477
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    78
		}		
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    79
	}
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    80
	
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    81
	protected NameEnvironmentAnswer findType(String name) {
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    82
		IBinaryType type = findTypeForClassNamed(name);
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    83
		if (type != null) {
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    84
			return new NameEnvironmentAnswer(type, null);
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
    85
		} else {
2472
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
			return null;
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
		}
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    88
	}
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
	/**
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
	 * Find a type named <typeName> in the package <packageName>.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
	 * Answer the binary form of the type if it is known to be consistent.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
	 * Otherwise, answer the compilation unit which defines the type
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
	 * or null if the type does not exist.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
	 * The default package is indicated by char[0][].
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
	 *
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    96
	 * It is known that the package containing the type exists.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    97
	 *
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    98
	 * NOTE: This method can be used to find a member type using its
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    99
	 * internal name A$B, but the source file for A is answered if the binary
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   100
	 * file is inconsistent.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   101
	 */
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   102
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   103
	public NameEnvironmentAnswer findType(char[] typeName, char[][] packageName) {
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   104
		StringBuffer sb = new StringBuffer();
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   105
		for (int i = 0; i < packageName.length; i++) {
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
			sb.append(packageName[i]);
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
			sb.append('.');
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
		}
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
		sb.append(typeName);
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
		return findType(sb.toString());
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
		
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
	}
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   113
	/**
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   114
	 * Answer whether packageName is the name of a known subpackage inside
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   115
	 * the package parentPackageName. A top level package is found relative to null.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   116
	 * The default package is always assumed to exist.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
	 *
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
	 * For example:
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
	 *      isPackage({{java}, {awt}}, {event});
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
	 *      isPackage(null, {java});
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   121
	 */
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   123
	public boolean isPackage(char[][] parentPackageName, char[] packageName) {
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   124
		return Character.isLowerCase(packageName[0]);
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
	}
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
	/**
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   128
	 * This method cleans the environment uo. It is responsible for releasing the memory
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
	 * and freeing resources. Passed that point, the name environment is no longer usable.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
	 *
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
	 * A name environment can have a long life cycle, therefore it is the responsibility of
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   132
	 * the code which created it to decide when it is a good time to clean it up.
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
	 */
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   134
	public void cleanup() {
2477
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   135
2472
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   136
	}
2477
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   137
	
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   138
	/**
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   139
	 * Given a class, return an InputStream on corresponding .class file. 
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   140
	 * @return InputStream or null
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   141
	 */
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   142
	public InputStream findClassFileForClass(Class<?> c) {
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   143
		/* STX:LIBJAVA specific: ask the class for its classfile bytes... */
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   144
		if (System.getProperty("java.vm.name").equals("Smalltalk/X")) {
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   145
			byte[] bytes = findClassBytesForClass0(c);
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   146
			if (bytes != null) {
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   147
				return new ByteArrayInputStream(bytes);
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   148
			}
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   149
		}
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   150
	
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   151
		ClassLoader cl = c.getClassLoader();
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   152
		if (cl == null) { 
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   153
			cl = ClassLoader.getSystemClassLoader();
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   154
		}
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   155
		String cfilename = (new String(c.getName())).replace('.', '/') + ".class";
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   156
		return cl.getResourceAsStream(cfilename);		
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   157
	}
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   158
	
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   159
	public native byte[] findClassBytesForClass0(Class<?> c); 
6e37b62e21b5 Bufix in CompilerEnvironment.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2472
diff changeset
   160
	
2472
226437481a47 Initial version of Eclipse compiler adapter.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   161
}