--- a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Fri Apr 12 12:05:04 2013 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Sat Apr 13 12:25:44 2013 +0100
@@ -40,6 +40,7 @@
import static com.sun.tools.javac.code.TypeTag.CLASS;
import static com.sun.tools.javac.code.TypeTag.TYPEVAR;
import static com.sun.tools.javac.code.TypeTag.VOID;
+import static com.sun.tools.javac.comp.CompileStates.CompileState;
/** This pass translates Generic Java to conventional Java.
*
@@ -77,8 +78,11 @@
*/
private final boolean addBridges;
+ private final CompileStates compileStates;
+
protected TransTypes(Context context) {
context.put(transTypesKey, this);
+ compileStates = CompileStates.instance(context);
names = Names.instance(context);
log = Log.instance(context);
syms = Symtab.instance(context);
@@ -904,16 +908,40 @@
private Env<AttrContext> env;
+ private static final String statePreviousToFlowAssertMsg =
+ "The current compile state [%s] of class %s is previous to FLOW";
+
void translateClass(ClassSymbol c) {
Type st = types.supertype(c.type);
-
// process superclass before derived
- if (st.hasTag(CLASS))
+ if (st.hasTag(CLASS)) {
translateClass((ClassSymbol)st.tsym);
+ }
Env<AttrContext> myEnv = enter.typeEnvs.remove(c);
- if (myEnv == null)
+ if (myEnv == null) {
return;
+ }
+
+ /* The two assertions below are set for early detection of any attempt
+ * to translate a class that:
+ *
+ * 1) has no compile state being it the most outer class.
+ * We accept this condition for inner classes.
+ *
+ * 2) has a compile state which is previous to Flow state.
+ */
+ boolean envHasCompState = compileStates.get(myEnv) != null;
+ if (!envHasCompState && c.outermostClass() == c) {
+ Assert.error("No info for outermost class: " + myEnv.enclClass.sym);
+ }
+
+ if (envHasCompState &&
+ CompileState.FLOW.isAfter(compileStates.get(myEnv))) {
+ Assert.error(String.format(statePreviousToFlowAssertMsg,
+ compileStates.get(myEnv), myEnv.enclClass.sym));
+ }
+
Env<AttrContext> oldEnv = env;
try {
env = myEnv;